|
|
— |
pl:prolog:pllib:credit_system [2019/06/27 15:50] (aktualna) |
| ====== 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 ===== |
| |