Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

pl:prolog:pllib:credit_system [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 +====== Credit system ======
 +{{tag>​lists rules}}
 +===== Description =====
 +A credit evaluation system
 +
 +**Source**: ​ The Art of Prolog
 +===== Download =====
 +Program source code: {{credit_system.pl}}
 +===== Listing =====
 +<code prolog>
 +/*   ​Credit Evaluation
 +
 +     ​credit(Client,​Answer) :-
 + Answer is the reply to a request by Client for credit.
 +*/
 +      credit(Client,​Answer) :-
 +           ​ok_profile(Client),​
 +           ​collateral_rating(Client,​CollateralRating),​
 +           ​financial_rating(Client,​FinancialRating),​
 +           ​bank_yield(Client,​Yield),​
 +           ​evaluate(profile(CollateralRating,​FinancialRating,​Yield),​Answer) , !.
 +
 +/*  The collateral rating module
 +
 +     ​collateral_rating(Client,​Rating) :-
 + Rating is a qualitative description assessing the collateral
 + offered by Client to cover the request for credit.
 +*/
 +     ​collateral_rating(Client,​Rating) :-
 +        collateral_profile(Client,​FirstClass,​SecondClass,​Illiquid),​
 +        collateral_evaluation(FirstClass,​SecondClass,​Illiquid,​Rating).
 +
 +     ​collateral_profile(Client,​FirstClass,​SecondClass,​Illiquid) :-
 + requested_credit(Client,​Credit),​
 + collateral_percent(first_class,​Client,​Credit,​FirstClass),​
 + collateral_percent(second_class,​Client,​Credit,​SecondClass),​
 + collateral_percent(Illiquid,​Client,​Credit,​Illiquid).
 +
 +     ​collateral_percent(Type,​Client,​Total,​Value) :-
 + findall(X,​(collateral(Collateral,​Type),​
 + amount(Collateral,​Client,​X)),​Xs),​
 +   ​ sumlist(Xs,​Sum),​
 + Value is Sum*100/​Total.
 +
 +     /​* ​  ​Evaluation rules    */
 +
 +     ​collateral_evaluation(FirstClass,​SecondClass,​Illiquid,​excellent) :-
 +  FirstClass >= 100.
 +     ​collateral_evaluation(FirstClass,​SecondClass,​Illiquid,​excellent) :-
 +  FirstClass > 70, FirstClass + SecondClass >= 100.
 +     ​collateral_evaluation(FirstClass,​SecondClass,​Illiquid,​good) :-
 +  FirstClass + SecondClass > 60,
 +  FirstClass + SecondClass < 70,
 +  FirstClass + SecondClass + Illiquid >= 100.
 +
 +     /​* ​ Bank data - classification of collateral ​  */
 +
 +     ​collateral(local_currency_deposits,​first_class).
 +     ​collateral(foreign_currency_deposits,​first_class).
 +     ​collateral(negotiate_instruments,​second_class).
 +     ​collateral(mortgage,​illiquid).
 +
 +%    Financial rating
 +
 +/​*  ​
 +    financial_rating(Client,​Rating) :-
 + Rating ​ is a qualitative description assessing the financial ​
 + record offered by Client to support the request for credit.
 +*/
 +     ​financial_rating(Client,​Rating) :-
 +        financial_factors(Factors),​
 +        score(Factors,​Client,​0,​Score),​
 +        calibrate(Score,​Rating).
 +
 +     /​* ​  ​Financial evalauation rules   */
 +
 +     ​calibrate(Score,​bad) :-    Score =< -500.
 +     ​calibrate(Score,​medium) :-    -500 < Score, Score < 150.
 +     ​calibrate(Score,​good) :-    150 =< Score, Score < 1000.
 +     ​calibrate(Score,​excellent) :- Score >= 1000.
 +
 +     /​* ​ Bank data - weighting factors */
 +
 +     ​financial_factors([(net_worth_per_assets,​5),​
 +         ​(last_year_sales_growth,​1),​
 +         ​(gross_profits_on_sales,​5),​
 +         ​(short_term_debt_per_annual_sales,​2) ​ ]).
 +
 +     ​score([(Factor,​Weight)|Factors],​Client,​Acc,​Score) :-
 +        value(Factor,​Client,​Value),​
 +        Acc1 is Acc + Weight*Value,​
 +        score(Factors,​Client,​Acc1,​Score).
 +     ​score([],​Client,​Score,​Score).
 +
 +/*  Final evaluation ​   ​
 +
 +     ​evaluate(Profile,​Outcome) :-
 + Outcome is the reply to the client'​s Profile.
 +*/
 +     ​evaluate(Profile,​Answer) :- 
 + rule(Conditions,​Answer),​ verify(Conditions,​Profile).
 +
 +     ​verify([condition(Type,​Test,​Rating)|Conditions],​Profile) :-
 +        scale(Type,​Scale),​
 +        select_value(Type,​Profile,​Fact),​
 +        compare(Test,​Scale,​Fact,​Rating),​
 +        verify(Conditions,​Profile).
 +     ​verify([],​Profile).
 +
 +     ​compare('​=',​Scale,​Rating,​Rating).
 +     ​compare('>',​Scale,​Rating1,​Rating2) :-
 +        precedes(Scale,​Rating1,​Rating2).
 +     ​compare('>​=',​Scale,​Rating1,​Rating2) :-
 +        precedes(Scale,​Rating1,​Rating2) ; Rating1 = Rating2.
 +     ​compare('<',​Scale,​Rating1,​Rating2) :-
 +        precedes(Scale,​Rating2,​Rating1).
 +     ​compare('​=<',​Scale,​Rating1,​Rating2) :-
 +        precedes(Scale,​Rating2,​Rating1) ; Rating1 = Rating2.
 +
 +     ​precedes([R1|Rs],​R1,​R2).
 +     ​precedes([R|Rs],​R1,​R2) :- R \== R2, precedes(Rs,​R1,​R2).
 +
 + select_value(collateral,​profile(C,​F,​Y),​C).
 + select_value(finances,​profile(C,​F,​Y),​F).
 + select_value(yield,​profile(C,​F,​Y),​Y).
 +
 +     /​* ​ Utilities ​  */
 +
 + sumlist(Is,​Sum) :-
 + sumlist(Is,​0,​Sum).
 + sumlist([I|Is],​Temp,​Sum) :-
 + Temp1 is Temp + I,
 + sumlist(Is,​Temp1,​Sum).
 + sumlist([],​Sum,​Sum).
 +
 +
 +/*  Bank data and rules */
 +
 +rule([condition(collateral,'>​=',​excellent),​condition(finances,'>​=',​good),​
 + condition(yield,'>​=',​reasonable)],​give_credit).  ​
 +rule([condition(collateral,'​=',​good),​condition(finances,'​=',​good),​
 + condition(yield,'>​=',​reasonable)],​consult_superior).
 +rule([condition(collateral,'​=<',​moderate),​condition(finances,'​=<',​medium)],​
 +  ​ refuse_credit).
 +
 +scale(collateral,​[excellent,​good,​moderate]).
 +scale(finances,​[excellent,​good,​medium,​bad]).
 +scale(yield,​[excellent,​reasonable,​poor]).
 +
 +
 +   /​* ​  ​Client data  */
 +
 +bank_yield(client1,​excellent).
 +requested_credit(client1,​5000).
 +
 +amount(local_currency_deposits,​client1,​3000).
 +amount(foreign_currency_deposits,​client1,​2000).
 +amount(bank_guarantees,​client1,​300).
 +                     
 +amount(negotiate_instruments,​client1,​500).
 +amount(stocks,​client1,​900).
 +
 +amount(mortgage,​client1,​1200).
 +amount(documents,​client1,​1400).
 +
 +value(net_worth_per_assets,​client1,​40).
 +value(last_year_sales_growth,​client1,​20).
 +value(gross_profits_on_sales,​client1,​45).
 +value(short_term_debt_per_annual_sales,​client1,​9).
 +
 +ok_profile(client1).
 +
 +
 +%  Program 22.1:  A credit evaluation system
 +%  Program 22.2: Test data for the credit evaluation system
 +</​code>​
 +===== Comments =====
  
pl/prolog/pllib/credit_system.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0