/* 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