which included commits to RCS files with non-trunk default branches. git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@5 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
		
			
				
	
	
		
			81 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
%From lim@scorpio Tue Mar  8 10:11:36 1994
 | 
						|
% adapted by Thom Fruehwirth for CHRs 930308
 | 
						|
 | 
						|
% *************************************
 | 
						|
% CLP(R) Version 1.1 - Example Programs
 | 
						|
% *************************************
 | 
						|
%
 | 
						|
% Algebraic combinations of options transactions
 | 
						|
 | 
						|
% heaviside function
 | 
						|
h(X, Y, Z) :- Y < X, Z =:= 0.
 | 
						|
h(X, Y, Z) :- Y >= X, Z =:= 1. 
 | 
						|
 | 
						|
% ramp function
 | 
						|
r(X, Y, Z) :- Y < X , Z =:= 0.
 | 
						|
r(X, Y, Z) :- Y >= X, Z =:= Y - X.
 | 
						|
 | 
						|
% option valuation
 | 
						|
value(Type,Buy_or_Sell,S,C,P,I,X,B,Value) :-
 | 
						|
	check_param(S,C,P,I,X,B),
 | 
						|
	get_sign(Buy_or_Sell,Sign),
 | 
						|
	lookup_option(Type,S,C,P,I,X,B,
 | 
						|
		     B1,B2,H1,H2,R1,R2),
 | 
						|
	h(B1,S,T1),h(B2,S,T2),r(B1,S,T3),r(B2,S,T4),
 | 
						|
	Value =:= Sign*(H1*T1 + H2*T2 + R1*T3 + R2*T4).
 | 
						|
 | 
						|
% safety check
 | 
						|
check_param(S,C,P,I,X,B) :-
 | 
						|
	S >= 0, C >= 0, P >= 0,
 | 
						|
	I >= 0, X >= 0, B >= 0 .
 | 
						|
 | 
						|
% Buy or sell are just opposite
 | 
						|
get_sign(buy,S) :- S =:= -1.
 | 
						|
get_sign(sell,S) :- S =:= 1.
 | 
						|
 | 
						|
% lookup option vector
 | 
						|
lookup_option(Type,S,C,P,I,X,B,B1,B2,H1,H2,R1,R2) :- 
 | 
						|
	table(Type,S,C,P,I,X,B,B1,B2,H1,H2,R1,R2).
 | 
						|
 | 
						|
% Table of values for B1,B2,H1,H2,R1,R2
 | 
						|
% generic format - lookup_table(Type,Pos_neg,S,C,P,I,X,B,B1,B2,H1,H2,R1,R2).
 | 
						|
% where K to R21 are obtained from the table
 | 
						|
% M is a multiplier which is -1 or 1 depending on whether one
 | 
						|
% is buying or selling the option
 | 
						|
table(	stock,		S,	C,	P,	I,	X,	B,	0,	0,	S*(1+I),	0,	-1,	0).
 | 
						|
table(	call,		S,	C,	P,	I,	X,	B,	0,	X,	C*(1+I),	0,	0,	-1).
 | 
						|
table(	put,		S,	C,	P,	I,	X,	B,	0,	X,	P*(1+I)-X,	0,	1,	-1).
 | 
						|
table(	bond,		S,	C,	P,	I,	X,	B,	0,	0,	B*(1+I),	0,	0,	0).
 | 
						|
 | 
						|
 | 
						|
solve1(Wealth, Stockprice) :-
 | 
						|
	Wealth =:= Wealth1 + Wealth2,
 | 
						|
	X =:= 99,
 | 
						|
	P =:= 10, C =:= 10,
 | 
						|
	I =:= 0,
 | 
						|
	value(put, buy, Stockprice, _, P, I, X, _, Wealth1), 
 | 
						|
	value(call, buy, Stockprice, C, _, I, X, _, Wealth2).
 | 
						|
%	dump([Stockprice, Wealth]).
 | 
						|
 | 
						|
solve2(Wealth, Stockprice) :-
 | 
						|
	I =:= 0.1, P1 =:= 10, X1 =:= 20, 
 | 
						|
	value(put, sell, Stockprice, _, P1, I, X1, _, Wealth1), 
 | 
						|
	P2 =:= 18, X2 =:= 40, 
 | 
						|
	value(put, buy, Stockprice, _, P2, I, X2, _, Wealth2), 
 | 
						|
	C3 =:= 15, X3 =:= 60, 
 | 
						|
	value(call, buy, Stockprice, C3, _, I, X3, _, Wealth3), 
 | 
						|
	C4 =:= 10, X4 =:= 80, 
 | 
						|
	value(call, sell, Stockprice, C4, _, I, X4, _, Wealth4), 
 | 
						|
	Wealth =:= Wealth1 + Wealth2 + Wealth3 + Wealth4.
 | 
						|
%	dump([Stockprice, Wealth]).
 | 
						|
 | 
						|
go1 :- solve1(Wealth, Stockprice), fail.
 | 
						|
go1.
 | 
						|
 | 
						|
go2 :- solve2(Wealth, Stockprice), fail.
 | 
						|
go2.
 | 
						|
 | 
						|
?- printf("\n>>> Sample goals: go1/0, go2/0\n", []).
 | 
						|
 | 
						|
%=============================================================================
 |