Credit system

Description

A credit evaluation system

Source: The Art of Prolog

Download

Program source code: credit_system.pl

Listing

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

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