include CHR benchmarks
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1958 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
		
							
								
								
									
										25
									
								
								LGPL/chr/Benchmarks/benches.pl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								LGPL/chr/Benchmarks/benches.pl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					benches :-
 | 
				
			||||||
 | 
						bench(B),
 | 
				
			||||||
 | 
						atom_concat(B, '.chr', File),
 | 
				
			||||||
 | 
						style_check(-singleton),
 | 
				
			||||||
 | 
						abolish(main,0),
 | 
				
			||||||
 | 
						abolish(main,1),
 | 
				
			||||||
 | 
						load_files(File,[silent(true)]),
 | 
				
			||||||
 | 
					%	(main;main;main;main),
 | 
				
			||||||
 | 
						main,
 | 
				
			||||||
 | 
						fail.
 | 
				
			||||||
 | 
					benches.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bench(bool).
 | 
				
			||||||
 | 
					bench(fib).
 | 
				
			||||||
 | 
					bench(fibonacci).
 | 
				
			||||||
 | 
					bench(leq).
 | 
				
			||||||
 | 
					bench(primes).
 | 
				
			||||||
 | 
					bench(ta).
 | 
				
			||||||
 | 
					bench(wfs).
 | 
				
			||||||
 | 
					bench(zebra).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					prolog:cputime(Time) :-
 | 
				
			||||||
 | 
						statistics(runtime, [_,Time]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- benches.
 | 
				
			||||||
							
								
								
									
										323
									
								
								LGPL/chr/Benchmarks/bool.chr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										323
									
								
								LGPL/chr/Benchmarks/bool.chr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,323 @@
 | 
				
			|||||||
 | 
					%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
				
			||||||
 | 
					%%
 | 
				
			||||||
 | 
					%% Thom Fruehwirth ECRC 1991-1993
 | 
				
			||||||
 | 
					%% 910528 started boolean,and,or constraints
 | 
				
			||||||
 | 
					%% 910904 added xor,neg constraints
 | 
				
			||||||
 | 
					%% 911120 added imp constraint
 | 
				
			||||||
 | 
					%% 931110 ported to new release
 | 
				
			||||||
 | 
					%% 931111 added card constraint 
 | 
				
			||||||
 | 
					%% 961107 Christian Holzbaur, SICStus mods
 | 
				
			||||||
 | 
					%%
 | 
				
			||||||
 | 
					%% ported to hProlog by Tom Schrijvers June 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- module(bool,[main/0,main/1]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- use_module( library(chr)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- use_module(library(lists)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- chr_constraint boolean/1, and/3, or/3, xor/3, neg/2, imp/2, labeling/0, card/4.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					boolean(0) <=> true.
 | 
				
			||||||
 | 
					boolean(1) <=> true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					labeling, boolean(A)#Pc <=> 
 | 
				
			||||||
 | 
					( A=0 ; A=1), 
 | 
				
			||||||
 | 
					labeling
 | 
				
			||||||
 | 
					pragma passive(Pc).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% and/3 specification
 | 
				
			||||||
 | 
					%%and(0,0,0).
 | 
				
			||||||
 | 
					%%and(0,1,0).
 | 
				
			||||||
 | 
					%%and(1,0,0).
 | 
				
			||||||
 | 
					%%and(1,1,1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					and(0,X,Y) <=> Y=0.
 | 
				
			||||||
 | 
					and(X,0,Y) <=> Y=0.
 | 
				
			||||||
 | 
					and(1,X,Y) <=> Y=X.
 | 
				
			||||||
 | 
					and(X,1,Y) <=> Y=X.
 | 
				
			||||||
 | 
					and(X,Y,1) <=> X=1,Y=1.
 | 
				
			||||||
 | 
					and(X,X,Z) <=> X=Z.
 | 
				
			||||||
 | 
					%%and(X,Y,X) <=> imp(X,Y).
 | 
				
			||||||
 | 
					%%and(X,Y,Y) <=> imp(Y,X).
 | 
				
			||||||
 | 
					and(X,Y,A) \ and(X,Y,B) <=> A=B.
 | 
				
			||||||
 | 
					and(X,Y,A) \ and(Y,X,B) <=> A=B.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					labeling, and(A,B,C)#Pc <=> 
 | 
				
			||||||
 | 
					label_and(A,B,C), 
 | 
				
			||||||
 | 
					labeling
 | 
				
			||||||
 | 
					pragma passive(Pc).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					label_and(0,X,0).
 | 
				
			||||||
 | 
					label_and(1,X,X).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% or/3 specification
 | 
				
			||||||
 | 
					%%or(0,0,0).
 | 
				
			||||||
 | 
					%%or(0,1,1).
 | 
				
			||||||
 | 
					%%or(1,0,1).
 | 
				
			||||||
 | 
					%%or(1,1,1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					or(0,X,Y) <=> Y=X.
 | 
				
			||||||
 | 
					or(X,0,Y) <=> Y=X.
 | 
				
			||||||
 | 
					or(X,Y,0) <=> X=0,Y=0.
 | 
				
			||||||
 | 
					or(1,X,Y) <=> Y=1.
 | 
				
			||||||
 | 
					or(X,1,Y) <=> Y=1.
 | 
				
			||||||
 | 
					or(X,X,Z) <=> X=Z.
 | 
				
			||||||
 | 
					%%or(X,Y,X) <=> imp(Y,X).
 | 
				
			||||||
 | 
					%%or(X,Y,Y) <=> imp(X,Y).
 | 
				
			||||||
 | 
					or(X,Y,A) \ or(X,Y,B) <=> A=B.
 | 
				
			||||||
 | 
					or(X,Y,A) \ or(Y,X,B) <=> A=B.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					labeling, or(A,B,C)#Pc <=> 
 | 
				
			||||||
 | 
					label_or(A,B,C), 
 | 
				
			||||||
 | 
					labeling
 | 
				
			||||||
 | 
					pragma passive(Pc).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					label_or(0,X,X).
 | 
				
			||||||
 | 
					label_or(1,X,1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% xor/3 specification
 | 
				
			||||||
 | 
					%%xor(0,0,0).
 | 
				
			||||||
 | 
					%%xor(0,1,1).
 | 
				
			||||||
 | 
					%%xor(1,0,1).
 | 
				
			||||||
 | 
					%%xor(1,1,0).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					xor(0,X,Y) <=> X=Y.
 | 
				
			||||||
 | 
					xor(X,0,Y) <=> X=Y.
 | 
				
			||||||
 | 
					xor(X,Y,0) <=> X=Y.
 | 
				
			||||||
 | 
					xor(1,X,Y) <=> neg(X,Y).
 | 
				
			||||||
 | 
					xor(X,1,Y) <=> neg(X,Y).
 | 
				
			||||||
 | 
					xor(X,Y,1) <=> neg(X,Y).
 | 
				
			||||||
 | 
					xor(X,X,Y) <=> Y=0.
 | 
				
			||||||
 | 
					xor(X,Y,X) <=> Y=0.
 | 
				
			||||||
 | 
					xor(Y,X,X) <=> Y=0.
 | 
				
			||||||
 | 
					xor(X,Y,A) \ xor(X,Y,B) <=> A=B.
 | 
				
			||||||
 | 
					xor(X,Y,A) \ xor(Y,X,B) <=> A=B.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					labeling, xor(A,B,C)#Pc <=> 
 | 
				
			||||||
 | 
					label_xor(A,B,C), 
 | 
				
			||||||
 | 
					labeling
 | 
				
			||||||
 | 
					pragma passive(Pc).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					label_xor(0,X,X).
 | 
				
			||||||
 | 
					label_xor(1,X,Y):- neg(X,Y).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% neg/2 specification
 | 
				
			||||||
 | 
					%%neg(0,1).
 | 
				
			||||||
 | 
					%%neg(1,0).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					neg(0,X) <=> X=1.
 | 
				
			||||||
 | 
					neg(X,0) <=> X=1.
 | 
				
			||||||
 | 
					neg(1,X) <=> X=0.
 | 
				
			||||||
 | 
					neg(X,1) <=> X=0.
 | 
				
			||||||
 | 
					neg(X,X) <=> fail.
 | 
				
			||||||
 | 
					neg(X,Y) \ neg(Y,Z) <=> X=Z.	
 | 
				
			||||||
 | 
					neg(X,Y) \ neg(Z,Y) <=> X=Z.	
 | 
				
			||||||
 | 
					neg(Y,X) \ neg(Y,Z) <=> X=Z.	
 | 
				
			||||||
 | 
					%% Interaction with other boolean constraints
 | 
				
			||||||
 | 
					neg(X,Y) \ and(X,Y,Z) <=> Z=0.
 | 
				
			||||||
 | 
					neg(Y,X) \ and(X,Y,Z) <=> Z=0.
 | 
				
			||||||
 | 
					neg(X,Z) , and(X,Y,Z) <=> X=1,Y=0,Z=0.
 | 
				
			||||||
 | 
					neg(Z,X) , and(X,Y,Z) <=> X=1,Y=0,Z=0.
 | 
				
			||||||
 | 
					neg(Y,Z) , and(X,Y,Z) <=> X=0,Y=1,Z=0.
 | 
				
			||||||
 | 
					neg(Z,Y) , and(X,Y,Z) <=> X=0,Y=1,Z=0.
 | 
				
			||||||
 | 
					neg(X,Y) \ or(X,Y,Z) <=> Z=1.
 | 
				
			||||||
 | 
					neg(Y,X) \ or(X,Y,Z) <=> Z=1.
 | 
				
			||||||
 | 
					neg(X,Z) , or(X,Y,Z) <=> X=0,Y=1,Z=1.
 | 
				
			||||||
 | 
					neg(Z,X) , or(X,Y,Z) <=> X=0,Y=1,Z=1.
 | 
				
			||||||
 | 
					neg(Y,Z) , or(X,Y,Z) <=> X=1,Y=0,Z=1.
 | 
				
			||||||
 | 
					neg(Z,Y) , or(X,Y,Z) <=> X=1,Y=0,Z=1.
 | 
				
			||||||
 | 
					neg(X,Y) \ xor(X,Y,Z) <=> Z=1.
 | 
				
			||||||
 | 
					neg(Y,X) \ xor(X,Y,Z) <=> Z=1.
 | 
				
			||||||
 | 
					neg(X,Z) \ xor(X,Y,Z) <=> Y=1.
 | 
				
			||||||
 | 
					neg(Z,X) \ xor(X,Y,Z) <=> Y=1.
 | 
				
			||||||
 | 
					neg(Y,Z) \ xor(X,Y,Z) <=> X=1.
 | 
				
			||||||
 | 
					neg(Z,Y) \ xor(X,Y,Z) <=> X=1.
 | 
				
			||||||
 | 
					neg(X,Y) , imp(X,Y) <=> X=0,Y=1.
 | 
				
			||||||
 | 
					neg(Y,X) , imp(X,Y) <=> X=0,Y=1.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					labeling, neg(A,B)#Pc <=> 
 | 
				
			||||||
 | 
					label_neg(A,B), 
 | 
				
			||||||
 | 
					labeling
 | 
				
			||||||
 | 
					pragma passive(Pc).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					label_neg(0,1).
 | 
				
			||||||
 | 
					label_neg(1,0).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% imp/2 specification (implication)
 | 
				
			||||||
 | 
					%%imp(0,0).
 | 
				
			||||||
 | 
					%%imp(0,1).
 | 
				
			||||||
 | 
					%%imp(1,1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					imp(0,X) <=> true.
 | 
				
			||||||
 | 
					imp(X,0) <=> X=0.
 | 
				
			||||||
 | 
					imp(1,X) <=> X=1.
 | 
				
			||||||
 | 
					imp(X,1) <=> true.
 | 
				
			||||||
 | 
					imp(X,X) <=> true.
 | 
				
			||||||
 | 
					imp(X,Y),imp(Y,X) <=> X=Y.	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					labeling, imp(A,B)#Pc <=> 
 | 
				
			||||||
 | 
					label_imp(A,B), 
 | 
				
			||||||
 | 
					labeling
 | 
				
			||||||
 | 
					pragma passive(Pc).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					label_imp(0,X).
 | 
				
			||||||
 | 
					label_imp(1,1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% Boolean cardinality operator
 | 
				
			||||||
 | 
					%% card(A,B,L,N) constrains list L of length N to have between A and B 1s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					card(A,B,L):- 
 | 
				
			||||||
 | 
						length(L,N), 
 | 
				
			||||||
 | 
						A=<B,0=<B,A=<N,				%0=<N 	
 | 
				
			||||||
 | 
						card(A,B,L,N).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% card/4 specification
 | 
				
			||||||
 | 
					%%card(A,B,[],0):- A=<0,0=<B.
 | 
				
			||||||
 | 
					%%card(A,B,[0|L],N):-
 | 
				
			||||||
 | 
					%%		N1 is N-1,
 | 
				
			||||||
 | 
					%%		card(A,B,L,N1).
 | 
				
			||||||
 | 
					%%card(A,B,[1|L],N):-  
 | 
				
			||||||
 | 
					%%		A1 is A-1, B1 is B-1, N1 is N-1,
 | 
				
			||||||
 | 
					%%		card(A1,B1,L,N1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					triv_sat @ card(A,B,L,N) <=> A=<0,N=<B | true. % trivial satisfaction
 | 
				
			||||||
 | 
					pos_sat @ card(N,B,L,N) <=> set_to_ones(L).	% positive satisfaction
 | 
				
			||||||
 | 
					neg_sat @ card(A,0,L,N) <=> set_to_zeros(L). % negative satisfaction
 | 
				
			||||||
 | 
					pos_red @ card(A,B,L,N) <=> b_delete(X,L,L1),X==1 | % positive reduction
 | 
				
			||||||
 | 
					A1 is A-1, B1 is B-1, N1 is N-1,
 | 
				
			||||||
 | 
					card(A1,B1,L1,N1).
 | 
				
			||||||
 | 
					neg_red @ card(A,B,L,N) <=> b_delete(X,L,L1),X==0 | % negative reduction
 | 
				
			||||||
 | 
					N1 is N-1,
 | 
				
			||||||
 | 
					card(A,B,L1,N1).
 | 
				
			||||||
 | 
					%% special cases with two variables
 | 
				
			||||||
 | 
					card2nand @ card(0,1,[X,Y],2) <=> and(X,Y,0).		
 | 
				
			||||||
 | 
					card2neg @ card(1,1,[X,Y],2) <=> neg(X,Y).		
 | 
				
			||||||
 | 
					card2or @ card(1,2,[X,Y],2) <=> or(X,Y,1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					b_delete( X, [X|L],  L).
 | 
				
			||||||
 | 
					b_delete( Y, [X|Xs], [X|Xt]) :-
 | 
				
			||||||
 | 
						b_delete( Y, Xs, Xt).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					labeling, card(A,B,L,N)#Pc <=> 
 | 
				
			||||||
 | 
					label_card(A,B,L,N), 
 | 
				
			||||||
 | 
					labeling
 | 
				
			||||||
 | 
					pragma passive(Pc).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					label_card(A,B,[],0):- A=<0,0=<B.
 | 
				
			||||||
 | 
					label_card(A,B,[0|L],N):-
 | 
				
			||||||
 | 
						%N1 is N-1,
 | 
				
			||||||
 | 
						card(A,B,L).
 | 
				
			||||||
 | 
					label_card(A,B,[1|L],N):-  
 | 
				
			||||||
 | 
						A1 is A-1, B1 is B-1, %N1 is N-1,
 | 
				
			||||||
 | 
						card(A1,B1,L).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set_to_ones([]).
 | 
				
			||||||
 | 
					set_to_ones([1|L]):-
 | 
				
			||||||
 | 
						set_to_ones(L).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set_to_zeros([]).
 | 
				
			||||||
 | 
					set_to_zeros([0|L]):-
 | 
				
			||||||
 | 
						set_to_zeros(L).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% Auxiliary predicates
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- op(100,xfy,#).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					solve_bool(A,C) :- var(A), !, A=C.
 | 
				
			||||||
 | 
					solve_bool(A,C) :- atomic(A), !, A=C.
 | 
				
			||||||
 | 
					solve_bool(A * B, C) :- !,
 | 
				
			||||||
 | 
						solve_bool(A,A1),
 | 
				
			||||||
 | 
						solve_bool(B,B1),
 | 
				
			||||||
 | 
						and(A1,B1,C).
 | 
				
			||||||
 | 
					solve_bool(A + B, C) :- !,
 | 
				
			||||||
 | 
						solve_bool(A,A1),
 | 
				
			||||||
 | 
						solve_bool(B,B1),
 | 
				
			||||||
 | 
						or(A1,B1,C).
 | 
				
			||||||
 | 
					solve_bool(A # B, C) :- !,
 | 
				
			||||||
 | 
						solve_bool(A,A1),
 | 
				
			||||||
 | 
						solve_bool(B,B1),
 | 
				
			||||||
 | 
						xor(A1,B1,C).
 | 
				
			||||||
 | 
					solve_bool(not(A),C) :- !, 
 | 
				
			||||||
 | 
						solve_bool(A,A1),
 | 
				
			||||||
 | 
						neg(A1,C).
 | 
				
			||||||
 | 
					solve_bool((A -> B), C) :- !,
 | 
				
			||||||
 | 
						solve_bool(A,A1),
 | 
				
			||||||
 | 
						solve_bool(B,B1),
 | 
				
			||||||
 | 
						imp(A1,B1),C=1.
 | 
				
			||||||
 | 
					solve_bool(A = B, C) :- !,
 | 
				
			||||||
 | 
						solve_bool(A,A1),
 | 
				
			||||||
 | 
						solve_bool(B,B1),
 | 
				
			||||||
 | 
						A1=B1,C=1.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% Labeling 
 | 
				
			||||||
 | 
					label_bool([]).
 | 
				
			||||||
 | 
					label_bool([X|L]) :-
 | 
				
			||||||
 | 
						( X=0;X=1),
 | 
				
			||||||
 | 
						label_bool(L).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*				% no write macros in SICStus and hProlog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool_portray(and(A,B,C),Out):- !, Out = (A*B = C).
 | 
				
			||||||
 | 
					bool_portray(or(A,B,C),Out):- !, Out = (A+B = C).
 | 
				
			||||||
 | 
					bool_portray(xor(A,B,C),Out):- !, Out = (A#B = C).
 | 
				
			||||||
 | 
					bool_portray(neg(A,B),Out):- !, Out = (A= not(B)).
 | 
				
			||||||
 | 
					bool_portray(imp(A,B),Out):- !, Out = (A -> B).
 | 
				
			||||||
 | 
					bool_portray(card(A,B,L,N),Out):- !, Out = card(A,B,L).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- define_macro(type(compound),bool_portray/2,[write]).
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* end of handler bool */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					half_adder(X,Y,S,C) :-
 | 
				
			||||||
 | 
						xor(X,Y,S),
 | 
				
			||||||
 | 
						and(X,Y,C).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					full_adder(X,Y,Ci,S,Co) :-
 | 
				
			||||||
 | 
						half_adder(X,Y,S1,Co1),
 | 
				
			||||||
 | 
						half_adder(Ci,S1,S,Co2),
 | 
				
			||||||
 | 
						or(Co1,Co2,Co).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main :-
 | 
				
			||||||
 | 
						main(60000).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main(N) :-
 | 
				
			||||||
 | 
						cputime(X),
 | 
				
			||||||
 | 
						adder(N),
 | 
				
			||||||
 | 
						cputime(Now),
 | 
				
			||||||
 | 
						Time is Now - X,
 | 
				
			||||||
 | 
						write(bench(bool, N, Time, 0, hprolog)),write('.'),nl.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					adder(N) :-
 | 
				
			||||||
 | 
						length(Ys,N),
 | 
				
			||||||
 | 
						add(N,Ys).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add(N,[Y|Ys]) :-
 | 
				
			||||||
 | 
						half_adder(1,Y,0,C),
 | 
				
			||||||
 | 
						add0(Ys,C).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add0([],1).
 | 
				
			||||||
 | 
					add0([Y|Ys],C) :-
 | 
				
			||||||
 | 
						full_adder(0,Y,C,1,NC),
 | 
				
			||||||
 | 
						add1(Ys,NC).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add1([],0).
 | 
				
			||||||
 | 
					add1([Y|Ys],C) :-
 | 
				
			||||||
 | 
						full_adder(1,Y,C,0,NC),
 | 
				
			||||||
 | 
						add0(Ys,NC).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%cputime(Time) :-
 | 
				
			||||||
 | 
					%	statistics(runtime, [_,Time]).
 | 
				
			||||||
							
								
								
									
										34
									
								
								LGPL/chr/Benchmarks/fib.chr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								LGPL/chr/Benchmarks/fib.chr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
				
			||||||
 | 
					%%
 | 
				
			||||||
 | 
					%% 991202 Slim Abdennadher, LMU
 | 
				
			||||||
 | 
					%%
 | 
				
			||||||
 | 
					%% ported to hProlog by Tom Schrijvers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- module(fib,[main/0,main/1]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- use_module(library(chr)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- chr_constraint fib/2.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% fib(N,M) is true if  M is the Nth Fibonacci number.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% Top-down Evaluation with Tabulation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fib(N,M1), fib(N,M2) <=> M1 = M2, fib(N,M1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fib(0,M) ==> M = 1.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fib(1,M) ==> M = 1.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fib(N,M) ==> N > 1 | N1 is N-1, fib(N1,M1), N2 is N-2, fib(N2,M2), M is M1 + M2.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main :-
 | 
				
			||||||
 | 
						main(22).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main(N):-
 | 
				
			||||||
 | 
						cputime(X),
 | 
				
			||||||
 | 
						fib(N,_),
 | 
				
			||||||
 | 
						cputime( Now),
 | 
				
			||||||
 | 
						Time is Now-X,
 | 
				
			||||||
 | 
						write(bench(fib ,N,Time, 0, hprolog)),write('.'), nl.
 | 
				
			||||||
 | 
					                 
 | 
				
			||||||
							
								
								
									
										42
									
								
								LGPL/chr/Benchmarks/fibonacci.chr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								LGPL/chr/Benchmarks/fibonacci.chr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
				
			||||||
 | 
					%%
 | 
				
			||||||
 | 
					%% 16 June 2003 Bart Demoen, Tom Schrijvers, K.U.Leuven
 | 
				
			||||||
 | 
					%%
 | 
				
			||||||
 | 
					%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- module(fibonacci,[main/0,main/1]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- use_module(library(chr)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- chr_constraint fibonacci/2.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% fibonacci(N,M) is true iff  M is the Nth Fibonacci number.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% Top-down Evaluation with effective Tabulation
 | 
				
			||||||
 | 
					%% Contrary to the version in the SICStus manual, this one does "true"
 | 
				
			||||||
 | 
					%% tabulation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fibonacci(N,M1) # ID \ fibonacci(N,M2) <=> var(M2) | M1 = M2 pragma passive(ID).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fibonacci(0,M) ==> M = 1.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fibonacci(1,M) ==> M = 1.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fibonacci(N,M) ==>
 | 
				
			||||||
 | 
						N > 1 | 
 | 
				
			||||||
 | 
							N1 is N-1,
 | 
				
			||||||
 | 
							fibonacci(N1,M1),
 | 
				
			||||||
 | 
							N2 is N-2,
 | 
				
			||||||
 | 
							fibonacci(N2,M2),
 | 
				
			||||||
 | 
							M is M1 + M2.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main :-
 | 
				
			||||||
 | 
						main(2000).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main(N):-
 | 
				
			||||||
 | 
						cputime(X),
 | 
				
			||||||
 | 
						fibonacci(N,_),
 | 
				
			||||||
 | 
						cputime( Now),
 | 
				
			||||||
 | 
						Time is Now-X,
 | 
				
			||||||
 | 
						write(bench(fibonacci ,N,Time, 0, hprolog)),write('.'), nl.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										138
									
								
								LGPL/chr/Benchmarks/fulladder.chr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								LGPL/chr/Benchmarks/fulladder.chr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,138 @@
 | 
				
			|||||||
 | 
					%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
				
			||||||
 | 
					%%
 | 
				
			||||||
 | 
					%% Thom Fruehwirth ECRC 1991-1993
 | 
				
			||||||
 | 
					%% 910528 started boolean,and,or constraints
 | 
				
			||||||
 | 
					%% 910904 added xor,neg constraints
 | 
				
			||||||
 | 
					%% 911120 added imp constraint
 | 
				
			||||||
 | 
					%% 931110 ported to new release
 | 
				
			||||||
 | 
					%% 931111 added card constraint 
 | 
				
			||||||
 | 
					%% 961107 Christian Holzbaur, SICStus mods
 | 
				
			||||||
 | 
					%%
 | 
				
			||||||
 | 
					%% ported to hProlog by Tom Schrijvers June 2003
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- module(fulladder,[main/0,main/1]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- chr_constraint and/3, or/3, xor/3, neg/2.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- use_module(library(lists)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% and/3 specification
 | 
				
			||||||
 | 
					%%and(0,0,0).
 | 
				
			||||||
 | 
					%%and(0,1,0).
 | 
				
			||||||
 | 
					%%and(1,0,0).
 | 
				
			||||||
 | 
					%%and(1,1,1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					and(0,X,Y) <=> Y=0.
 | 
				
			||||||
 | 
					and(X,0,Y) <=> Y=0.
 | 
				
			||||||
 | 
					and(1,X,Y) <=> Y=X.
 | 
				
			||||||
 | 
					and(X,1,Y) <=> Y=X.
 | 
				
			||||||
 | 
					and(X,Y,1) <=> X=1,Y=1.
 | 
				
			||||||
 | 
					and(X,X,Z) <=> X=Z.
 | 
				
			||||||
 | 
					and(X,Y,A) \ and(X,Y,B) <=> A=B, chr_dummy.
 | 
				
			||||||
 | 
					and(X,Y,A) \ and(Y,X,B) <=> A=B, chr_dummy.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% or/3 specification
 | 
				
			||||||
 | 
					%%or(0,0,0).
 | 
				
			||||||
 | 
					%%or(0,1,1).
 | 
				
			||||||
 | 
					%%or(1,0,1).
 | 
				
			||||||
 | 
					%%or(1,1,1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					or(0,X,Y) <=> Y=X.
 | 
				
			||||||
 | 
					or(X,0,Y) <=> Y=X.
 | 
				
			||||||
 | 
					or(X,Y,0) <=> X=0,Y=0.
 | 
				
			||||||
 | 
					or(1,X,Y) <=> Y=1.
 | 
				
			||||||
 | 
					or(X,1,Y) <=> Y=1.
 | 
				
			||||||
 | 
					or(X,X,Z) <=> X=Z.
 | 
				
			||||||
 | 
					or(X,Y,A) \ or(X,Y,B) <=> A=B, chr_dummy.
 | 
				
			||||||
 | 
					or(X,Y,A) \ or(Y,X,B) <=> A=B, chr_dummy.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% xor/3 specification
 | 
				
			||||||
 | 
					%%xor(0,0,0).
 | 
				
			||||||
 | 
					%%xor(0,1,1).
 | 
				
			||||||
 | 
					%%xor(1,0,1).
 | 
				
			||||||
 | 
					%%xor(1,1,0).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					xor(0,X,Y) <=> X=Y.
 | 
				
			||||||
 | 
					xor(X,0,Y) <=> X=Y.
 | 
				
			||||||
 | 
					xor(X,Y,0) <=> X=Y.
 | 
				
			||||||
 | 
					xor(1,X,Y) <=> neg(X,Y).
 | 
				
			||||||
 | 
					xor(X,1,Y) <=> neg(X,Y).
 | 
				
			||||||
 | 
					xor(X,Y,1) <=> neg(X,Y).
 | 
				
			||||||
 | 
					xor(X,X,Y) <=> Y=0.
 | 
				
			||||||
 | 
					xor(X,Y,X) <=> Y=0.
 | 
				
			||||||
 | 
					xor(Y,X,X) <=> Y=0.
 | 
				
			||||||
 | 
					xor(X,Y,A) \ xor(X,Y,B) <=> A=B, chr_dummy.
 | 
				
			||||||
 | 
					xor(X,Y,A) \ xor(Y,X,B) <=> A=B, chr_dummy.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% neg/2 specification
 | 
				
			||||||
 | 
					%%neg(0,1).
 | 
				
			||||||
 | 
					%%neg(1,0).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					neg(0,X) <=> X=1.
 | 
				
			||||||
 | 
					neg(X,0) <=> X=1.
 | 
				
			||||||
 | 
					neg(1,X) <=> X=0.
 | 
				
			||||||
 | 
					neg(X,1) <=> X=0.
 | 
				
			||||||
 | 
					neg(X,X) <=> fail.
 | 
				
			||||||
 | 
					neg(X,Y) \ neg(Y,Z) <=> X=Z, chr_dummy.	
 | 
				
			||||||
 | 
					neg(X,Y) \ neg(Z,Y) <=> X=Z, chr_dummy.	
 | 
				
			||||||
 | 
					neg(Y,X) \ neg(Y,Z) <=> X=Z, chr_dummy.	
 | 
				
			||||||
 | 
					%% Interaction with other boolean constraints
 | 
				
			||||||
 | 
					neg(X,Y) \ and(X,Y,Z) <=> Z=0, chr_dummy.
 | 
				
			||||||
 | 
					neg(Y,X) \ and(X,Y,Z) <=> Z=0, chr_dummy.
 | 
				
			||||||
 | 
					neg(X,Z) , and(X,Y,Z) <=> X=1,Y=0,Z=0.
 | 
				
			||||||
 | 
					neg(Z,X) , and(X,Y,Z) <=> X=1,Y=0,Z=0.
 | 
				
			||||||
 | 
					neg(Y,Z) , and(X,Y,Z) <=> X=0,Y=1,Z=0.
 | 
				
			||||||
 | 
					neg(Z,Y) , and(X,Y,Z) <=> X=0,Y=1,Z=0.
 | 
				
			||||||
 | 
					neg(X,Y) \ or(X,Y,Z) <=> Z=1, chr_dummy.
 | 
				
			||||||
 | 
					neg(Y,X) \ or(X,Y,Z) <=> Z=1, chr_dummy.
 | 
				
			||||||
 | 
					neg(X,Z) , or(X,Y,Z) <=> X=0,Y=1,Z=1.
 | 
				
			||||||
 | 
					neg(Z,X) , or(X,Y,Z) <=> X=0,Y=1,Z=1.
 | 
				
			||||||
 | 
					neg(Y,Z) , or(X,Y,Z) <=> X=1,Y=0,Z=1.
 | 
				
			||||||
 | 
					neg(Z,Y) , or(X,Y,Z) <=> X=1,Y=0,Z=1.
 | 
				
			||||||
 | 
					neg(X,Y) \ xor(X,Y,Z) <=> Z=1, chr_dummy.
 | 
				
			||||||
 | 
					neg(Y,X) \ xor(X,Y,Z) <=> Z=1, chr_dummy.
 | 
				
			||||||
 | 
					neg(X,Z) \ xor(X,Y,Z) <=> Y=1, chr_dummy.
 | 
				
			||||||
 | 
					neg(Z,X) \ xor(X,Y,Z) <=> Y=1, chr_dummy.
 | 
				
			||||||
 | 
					neg(Y,Z) \ xor(X,Y,Z) <=> X=1, chr_dummy.
 | 
				
			||||||
 | 
					neg(Z,Y) \ xor(X,Y,Z) <=> X=1, chr_dummy.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* end of handler bool */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					half_adder(X,Y,S,C) :-
 | 
				
			||||||
 | 
						xor(X,Y,S),
 | 
				
			||||||
 | 
						and(X,Y,C).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					full_adder(X,Y,Ci,S,Co) :-
 | 
				
			||||||
 | 
						half_adder(X,Y,S1,Co1),
 | 
				
			||||||
 | 
						half_adder(Ci,S1,S,Co2),
 | 
				
			||||||
 | 
						or(Co1,Co2,Co).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main :-
 | 
				
			||||||
 | 
						main(6000).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main(N) :-
 | 
				
			||||||
 | 
						cputime(X),
 | 
				
			||||||
 | 
						adder(N),
 | 
				
			||||||
 | 
						cputime(Now),
 | 
				
			||||||
 | 
						Time is Now - X,
 | 
				
			||||||
 | 
						write(bench(bool ,N,Time,0,hprolog)),write('.'),nl.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					adder(N) :-
 | 
				
			||||||
 | 
						length(Ys,N),
 | 
				
			||||||
 | 
						add(N,Ys).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add(N,[Y|Ys]) :-
 | 
				
			||||||
 | 
						half_adder(1,Y,0,C),
 | 
				
			||||||
 | 
						add0(Ys,C).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add0([],1).
 | 
				
			||||||
 | 
					add0([Y|Ys],C) :-
 | 
				
			||||||
 | 
						full_adder(0,Y,C,1,NC),
 | 
				
			||||||
 | 
						add1(Ys,NC).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add1([],0).
 | 
				
			||||||
 | 
					add1([Y|Ys],C) :-
 | 
				
			||||||
 | 
						full_adder(1,Y,C,0,NC),
 | 
				
			||||||
 | 
						add0(Ys,NC).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										34
									
								
								LGPL/chr/Benchmarks/leq.chr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								LGPL/chr/Benchmarks/leq.chr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
				
			||||||
 | 
					%%
 | 
				
			||||||
 | 
					%% simple constraint solver for inequalities between variables
 | 
				
			||||||
 | 
					%% thom fruehwirth ECRC 950519, LMU 980207, 980311
 | 
				
			||||||
 | 
					%%
 | 
				
			||||||
 | 
					%% ported to hProlog by Tom Schrijvers 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- module(leq,[main/0,main/1]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- use_module(library(chr)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- chr_constraint leq/2.
 | 
				
			||||||
 | 
					reflexivity  @ leq(X,X) <=> true.
 | 
				
			||||||
 | 
					antisymmetry @ leq(X,Y), leq(Y,X) <=> X = Y.
 | 
				
			||||||
 | 
					idempotence  @ leq(X,Y) \ leq(X,Y) <=> true.
 | 
				
			||||||
 | 
					transitivity @ leq(X,Y), leq(Y,Z) ==> leq(X,Z).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main :-
 | 
				
			||||||
 | 
						main(60).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main(N):-
 | 
				
			||||||
 | 
						cputime(X),
 | 
				
			||||||
 | 
						length(L,N),
 | 
				
			||||||
 | 
						genleq(L,Last),
 | 
				
			||||||
 | 
						L=[First|_],
 | 
				
			||||||
 | 
						leq(Last,First),
 | 
				
			||||||
 | 
						cputime( Now),
 | 
				
			||||||
 | 
						Time is Now-X,
 | 
				
			||||||
 | 
						write(bench(leq ,N,Time,0,hprolog)), write('.'),nl.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					genleq([Last],Last) :- ! .
 | 
				
			||||||
 | 
					genleq([X,Y|Xs],Last):-
 | 
				
			||||||
 | 
						leq(X,Y),
 | 
				
			||||||
 | 
						genleq([Y|Xs],Last).
 | 
				
			||||||
							
								
								
									
										30
									
								
								LGPL/chr/Benchmarks/primes.chr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								LGPL/chr/Benchmarks/primes.chr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
				
			||||||
 | 
					%%
 | 
				
			||||||
 | 
					%% Sieve of eratosthenes to compute primes
 | 
				
			||||||
 | 
					%% thom fruehwirth 920218-20, 980311
 | 
				
			||||||
 | 
					%% christian holzbaur 980207 for Sicstus CHR
 | 
				
			||||||
 | 
					%%
 | 
				
			||||||
 | 
					%% ported to hProlog by Tom Schrijvers 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- module(primes,[main/0,main/1]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- use_module(library(chr)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- chr_constraint candidate/1.
 | 
				
			||||||
 | 
					:- chr_constraint prime/1.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					candidate(1) <=> true.
 | 
				
			||||||
 | 
					candidate(N) <=> primes:prime(N), N1 is N - 1, primes:candidate(N1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					absorb @ prime(Y) \ prime(X) <=> 0 =:= X mod Y | true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main :-
 | 
				
			||||||
 | 
						main(2500).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main(N):-
 | 
				
			||||||
 | 
						cputime(X),
 | 
				
			||||||
 | 
						candidate(N),
 | 
				
			||||||
 | 
						cputime( Now),
 | 
				
			||||||
 | 
						Time is Now-X,
 | 
				
			||||||
 | 
						write(bench(primes ,N,Time,0,hprolog)), write('.'),nl.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										386
									
								
								LGPL/chr/Benchmarks/ta.chr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										386
									
								
								LGPL/chr/Benchmarks/ta.chr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,386 @@
 | 
				
			|||||||
 | 
					:- module(ta,[main/0,main/1]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- use_module(library(chr)).
 | 
				
			||||||
 | 
					:- use_module(library(lists)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Timed automaton => Constraints
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								=>
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						 X := N			geq(X,N)
 | 
				
			||||||
 | 
						-------->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						 X =< N			leq(X,N)
 | 
				
			||||||
 | 
						-------->
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						 X >= N			geq(X,N)
 | 
				
			||||||
 | 
						-------->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					n > 1,	1 ------> v		fincl(Xv,X1),
 | 
				
			||||||
 | 
						...    /		...
 | 
				
			||||||
 | 
						n ----/			fincl(Xv,Xn),
 | 
				
			||||||
 | 
									fub_init(Xv,[])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					n >= 1, v ------> 1		bincl(Xv,X1),
 | 
				
			||||||
 | 
						  \     ...		...
 | 
				
			||||||
 | 
						   \----> n		bincl(Xv,X1),
 | 
				
			||||||
 | 
									bub_init(Xv,[])
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%% handler ta.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- chr_constraint
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
						fincl/2, 	% expresses that clock 1 includes clock 2 (union)
 | 
				
			||||||
 | 
								% in the sense that clock 2 is forward of clock 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bincl/2, 	% expresses that clock 1 includes clock 2 (union)
 | 
				
			||||||
 | 
								% in the sense that clock 1 is forward of clock 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						leq/2, 		% expresses that clock 1 =< number 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						geq/2, 		% expresses that clock 1 >= number 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fub_init/2, 	% collects the inital upper bounds 
 | 
				
			||||||
 | 
								% from incoming arrows for clock 1 in list 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fub/2,		% collects the upper bounds for clock 1
 | 
				
			||||||
 | 
								% from incoming arrows in list 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						flb_init/2, 	% collects the inital lower bounds 
 | 
				
			||||||
 | 
								% from incoming arrows for clock 1 in list 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						flb/2,		% collects the lower bounds for clock 1
 | 
				
			||||||
 | 
								% from incoming arrows in list 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bub_init/2, 	% collects the inital upper bounds 
 | 
				
			||||||
 | 
								% from backward arrows for clock 1 in list 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bub/2,		% collects the upper bounds for clock 1
 | 
				
			||||||
 | 
								% from outgoing arrows in list 2
 | 
				
			||||||
 | 
								% values of clock 1 cannot exceed all
 | 
				
			||||||
 | 
								% values of the clocks in list 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						blb_init/2, 	% collects the inital lower bounds 
 | 
				
			||||||
 | 
								% from backward arrows for clock 1 in list 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						blb/2,		% collects the lower bounds for clock 1
 | 
				
			||||||
 | 
								% from outgoing arrows in list 2
 | 
				
			||||||
 | 
								% not all values of clock 1 can exceed any
 | 
				
			||||||
 | 
								% values of the clocks in list 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						compl/1,	% indicate that all incoming arrows for clock 1
 | 
				
			||||||
 | 
								% have been registerd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dist/3,		% indicates that clock 1 - clock 2 =< number 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fdist_init/3,	% records initial distances for clock 1 and clock 2 from
 | 
				
			||||||
 | 
								% incoming arrows in list 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fdist/3,	% records distances for clock 1 and clock 2 from
 | 
				
			||||||
 | 
								% incoming arrows in list 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						setdist/3.	% sets distance between clock 1 and clock 2, where
 | 
				
			||||||
 | 
								% clock 1 is reset to value 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* More Constraints:
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					leq(X,N1) \ leq(X,N2) <=> N1 =< N2 | true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					geq(X,N1) \ geq(X,N2) <=> N2 =< N1 | true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dist(X,Y,D1) \ dist(X,Y,D2) <=> D1 =< D2 | true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dist(X,Y,D), leq(Y,MY) \ leq(X,MX1) <=>
 | 
				
			||||||
 | 
						MX2 is MY + D, MX2 < MX1 | leq(X,MX2).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dist(X,Y,D), geq(X,MX) \ geq(Y,MY1) <=>
 | 
				
			||||||
 | 
						MY2 is MX - D, MY2 > MY1 | geq(Y,MY2).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fincl(X,Y), leq(Y,N) \ fub_init(X,L) 
 | 
				
			||||||
 | 
						<=> \+ memberchk_eq(N-Y,L) |
 | 
				
			||||||
 | 
						    insert_ub(L,Y,N,NL),
 | 
				
			||||||
 | 
						    fub_init(X,NL).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fincl(X,Y), geq(Y,N) \ flb_init(X,L) 
 | 
				
			||||||
 | 
						<=> \+ memberchk_eq(N-Y,L) |
 | 
				
			||||||
 | 
						    insert_lb(L,Y,N,NL),
 | 
				
			||||||
 | 
						    flb_init(X,NL).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dist(X1,Y1,D), fincl(X2,X1), fincl(Y2,Y1) \ fdist_init(X2,Y2,L)
 | 
				
			||||||
 | 
						<=>
 | 
				
			||||||
 | 
						\+ memberchk_eq(D-X1,L) |
 | 
				
			||||||
 | 
						insert_ub(L,X1,D,NL),
 | 
				
			||||||
 | 
						fdist_init(X2,Y2,NL).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bincl(X,Y), leq(Y,N) \ bub_init(X,L)
 | 
				
			||||||
 | 
						<=>
 | 
				
			||||||
 | 
						\+ memberchk_eq(N-Y,L) |
 | 
				
			||||||
 | 
						insert_ub(L,Y,N,NL),
 | 
				
			||||||
 | 
						bub_init(X,NL).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					compl(X) \ fub_init(X,L) # ID 
 | 
				
			||||||
 | 
						<=> 
 | 
				
			||||||
 | 
						fub(X,L),
 | 
				
			||||||
 | 
						val(L,M),
 | 
				
			||||||
 | 
						leq(X,M)
 | 
				
			||||||
 | 
						pragma passive(ID).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					compl(X) \ flb_init(X,L) # ID 
 | 
				
			||||||
 | 
						<=> 
 | 
				
			||||||
 | 
						flb(X,L),
 | 
				
			||||||
 | 
						val(L,M),
 | 
				
			||||||
 | 
						geq(X,M)
 | 
				
			||||||
 | 
						pragma passive(ID).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					compl(X), compl(Y) \ fdist_init(X,Y,L) # ID
 | 
				
			||||||
 | 
						<=>
 | 
				
			||||||
 | 
						fdist(X,Y,L),
 | 
				
			||||||
 | 
						val(L,D),
 | 
				
			||||||
 | 
						dist(X,Y,D)
 | 
				
			||||||
 | 
						pragma passive(ID).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					compl(X) \ bub_init(X,L) # ID 
 | 
				
			||||||
 | 
						<=> 
 | 
				
			||||||
 | 
						bub(X,L),
 | 
				
			||||||
 | 
						val(L,M),
 | 
				
			||||||
 | 
						leq(X,M)
 | 
				
			||||||
 | 
						pragma passive(ID).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fincl(X,Y), leq(Y,N) \ fub(X,L) 
 | 
				
			||||||
 | 
						<=>
 | 
				
			||||||
 | 
						\+ memberchk_eq(N-Y,L) |
 | 
				
			||||||
 | 
						insert_ub(L,Y,N,NL),
 | 
				
			||||||
 | 
						fub(X,NL),
 | 
				
			||||||
 | 
						val(NL,M),
 | 
				
			||||||
 | 
						leq(X,M).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fincl(X,Y), geq(Y,N) \ flb(X,L) 
 | 
				
			||||||
 | 
						<=>
 | 
				
			||||||
 | 
						\+ memberchk_eq(N-Y,L) |
 | 
				
			||||||
 | 
						insert_lb(L,Y,N,NL),
 | 
				
			||||||
 | 
						flb(X,NL),
 | 
				
			||||||
 | 
						val(NL,M),
 | 
				
			||||||
 | 
						geq(X,M).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bincl(X,Y), leq(Y,N) \ bub(X,L) 
 | 
				
			||||||
 | 
						<=>
 | 
				
			||||||
 | 
						\+ memberchk_eq(N-Y,L) |
 | 
				
			||||||
 | 
						insert_ub(L,Y,N,NL),
 | 
				
			||||||
 | 
						bub(X,NL),
 | 
				
			||||||
 | 
						val(NL,M),
 | 
				
			||||||
 | 
						leq(X,M).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fincl(X2,X1), fincl(Y2,Y1), dist(X1,Y1,D) \ fdist(X2,Y2,L)
 | 
				
			||||||
 | 
						<=>
 | 
				
			||||||
 | 
						\+ memberchk_eq(D-X1,L) |
 | 
				
			||||||
 | 
						insert_ub(L,X1,D,NL),
 | 
				
			||||||
 | 
						fdist(X2,Y2,NL),
 | 
				
			||||||
 | 
						val(NL,MD),
 | 
				
			||||||
 | 
						dist(X2,Y2,MD).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fincl(X,Y), leq(X,N) ==> leq(Y,N).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fincl(X,Y), geq(X,N) ==> geq(Y,N).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bincl(X,Y), geq(X,N) ==> geq(Y,N).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bincl(X1,X2), bincl(Y1,Y2), dist(X1,Y1,D1) \ dist(X2,Y2,D2) <=> D1 < D2 | dist(X2,Y2,D1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					setdist(X,Y,N), leq(Y,D1) ==> D2 is D1 - N, dist(Y,X,D2).
 | 
				
			||||||
 | 
					setdist(X,Y,N), geq(Y,D1) ==> D2 is N - D1, dist(X,Y,D2).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val([N-_|_],N).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					insert_ub([],X,N,[N-X]).
 | 
				
			||||||
 | 
					insert_ub([M-Y|R],X,N,NL) :-
 | 
				
			||||||
 | 
						( Y == X ->
 | 
				
			||||||
 | 
							insert_ub(R,X,N,NL)
 | 
				
			||||||
 | 
						; M > N ->
 | 
				
			||||||
 | 
							NL = [M-Y|NR],
 | 
				
			||||||
 | 
							insert_ub(R,X,N,NR)
 | 
				
			||||||
 | 
						;
 | 
				
			||||||
 | 
							NL = [N-X,M-Y|R]
 | 
				
			||||||
 | 
						).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					insert_lb([],X,N,[N-X]).
 | 
				
			||||||
 | 
					insert_lb([M-Y|R],X,N,NL) :-
 | 
				
			||||||
 | 
						( Y == X ->
 | 
				
			||||||
 | 
							insert_lb(R,X,N,NL)
 | 
				
			||||||
 | 
						; M < N ->
 | 
				
			||||||
 | 
							NL = [M-Y|NR],
 | 
				
			||||||
 | 
							insert_lb(R,X,N,NR)
 | 
				
			||||||
 | 
						;
 | 
				
			||||||
 | 
							NL = [N-X,M-Y|R]
 | 
				
			||||||
 | 
						).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					couple(X,Y) :-
 | 
				
			||||||
 | 
						dist(X,Y,10000),
 | 
				
			||||||
 | 
						dist(Y,X,10000).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					giri :-
 | 
				
			||||||
 | 
						giri([x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,x7,y7,x8,y8,x9,y9,x10,y10]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					giri(L) :-
 | 
				
			||||||
 | 
						L = [X1,Y1,X2,Y2,X3,Y3,X4,Y4,X5,Y5,X6,Y6,X7,Y7,X8,Y8,X9,Y9,X10,Y10],
 | 
				
			||||||
 | 
						clocks(L),
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						% 1.
 | 
				
			||||||
 | 
						couple(X1,Y1),
 | 
				
			||||||
 | 
						geq(X1,0),
 | 
				
			||||||
 | 
						geq(X2,0),
 | 
				
			||||||
 | 
						dist(X1,Y1,0),
 | 
				
			||||||
 | 
						dist(Y1,X1,0),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						% 2.
 | 
				
			||||||
 | 
						couple(X2,Y2),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fincl(X2,X1),
 | 
				
			||||||
 | 
						fincl(X2,X8),
 | 
				
			||||||
 | 
						fincl(X2,X10),
 | 
				
			||||||
 | 
						fub_init(X2,[]),
 | 
				
			||||||
 | 
						flb_init(X2,[]),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fincl(Y2,Y1),
 | 
				
			||||||
 | 
						fincl(Y2,Y8),
 | 
				
			||||||
 | 
						fincl(Y2,Y10),
 | 
				
			||||||
 | 
						fub_init(Y2,[]),
 | 
				
			||||||
 | 
						flb_init(Y2,[]),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bincl(X2,X3),
 | 
				
			||||||
 | 
						bincl(X2,X4),
 | 
				
			||||||
 | 
						bub_init(X2,[]),
 | 
				
			||||||
 | 
						blb_init(X2,[]),
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						bincl(Y2,Y3),
 | 
				
			||||||
 | 
						bincl(Y2,Y4),
 | 
				
			||||||
 | 
						bub_init(Y2,[]),
 | 
				
			||||||
 | 
						blb_init(Y2,[]),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fdist_init(X2,Y2,[]),
 | 
				
			||||||
 | 
						fdist_init(Y2,X2,[]),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						% 3.
 | 
				
			||||||
 | 
						couple(X3,Y3),
 | 
				
			||||||
 | 
						leq(X3,3),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bincl(X3,X9),
 | 
				
			||||||
 | 
						bincl(X3,X5),
 | 
				
			||||||
 | 
						bub_init(X3,[]),
 | 
				
			||||||
 | 
						blb_init(X3,[]),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bincl(Y3,Y9),
 | 
				
			||||||
 | 
						bincl(Y3,Y5),
 | 
				
			||||||
 | 
						bub_init(Y3,[]),
 | 
				
			||||||
 | 
						blb_init(Y3,[]),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						%fdist_init(X3,Y3,[]),
 | 
				
			||||||
 | 
						%fdist_init(Y3,X3,[]),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						% 4.
 | 
				
			||||||
 | 
						couple(X4,Y4),
 | 
				
			||||||
 | 
						geq(Y4,2),
 | 
				
			||||||
 | 
						leq(Y4,5),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						% 5.
 | 
				
			||||||
 | 
						couple(X5,Y5),
 | 
				
			||||||
 | 
						geq(Y5,5),
 | 
				
			||||||
 | 
						leq(Y5,10),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						% 6.
 | 
				
			||||||
 | 
						couple(X6,Y6),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fincl(X6,X4),
 | 
				
			||||||
 | 
						fincl(X6,X5),
 | 
				
			||||||
 | 
						fub_init(X6,[]),
 | 
				
			||||||
 | 
						flb_init(X6,[]),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fincl(Y6,Y4),
 | 
				
			||||||
 | 
						fincl(Y6,Y5),
 | 
				
			||||||
 | 
						fub_init(Y6,[]),
 | 
				
			||||||
 | 
						flb_init(Y6,[]),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bincl(X6,X7),
 | 
				
			||||||
 | 
						bub_init(X6,[]),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bincl(Y6,Y7),
 | 
				
			||||||
 | 
						bub_init(Y6,[]),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fdist_init(X6,Y6,[]),
 | 
				
			||||||
 | 
						fdist_init(Y6,X6,[]),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						% 7.
 | 
				
			||||||
 | 
						couple(X7,Y7),
 | 
				
			||||||
 | 
						geq(Y7,15),
 | 
				
			||||||
 | 
						leq(Y7,15),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						% 8.
 | 
				
			||||||
 | 
						couple(X8,Y8),
 | 
				
			||||||
 | 
						geq(X8,2),
 | 
				
			||||||
 | 
						geq(Y8,2),
 | 
				
			||||||
 | 
						dist(X8,Y8,0),
 | 
				
			||||||
 | 
						dist(Y8,X8,0),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						% 9.
 | 
				
			||||||
 | 
						couple(X9,Y9),
 | 
				
			||||||
 | 
						geq(Y9,5),
 | 
				
			||||||
 | 
						leq(Y9,5),
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						% 10.
 | 
				
			||||||
 | 
						couple(X10,Y10),
 | 
				
			||||||
 | 
						geq(X10,0),
 | 
				
			||||||
 | 
						geq(Y10,0),
 | 
				
			||||||
 | 
						dist(X10,Y10,0),
 | 
				
			||||||
 | 
						dist(Y10,X10,0),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						% finish
 | 
				
			||||||
 | 
						compl(X2),
 | 
				
			||||||
 | 
						compl(Y2),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						compl(X3),
 | 
				
			||||||
 | 
						compl(Y3),	
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						compl(X6),
 | 
				
			||||||
 | 
						compl(Y6).	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clocks([]).
 | 
				
			||||||
 | 
					clocks([C|Cs]) :-
 | 
				
			||||||
 | 
						clock(C),
 | 
				
			||||||
 | 
						clocks(Cs).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					clock(X) :-
 | 
				
			||||||
 | 
						geq(X,0),
 | 
				
			||||||
 | 
						leq(X,10000).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main :-
 | 
				
			||||||
 | 
						main(100).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main(N) :-
 | 
				
			||||||
 | 
						cputime(T1),
 | 
				
			||||||
 | 
						loop(N),
 | 
				
			||||||
 | 
						cputime(T2),
 | 
				
			||||||
 | 
						T is T2 - T1,
 | 
				
			||||||
 | 
						write(bench(ta ,N , T,0,hprolog)),write('.'),nl.
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop(N) :-
 | 
				
			||||||
 | 
						( N =< 0 ->
 | 
				
			||||||
 | 
							true
 | 
				
			||||||
 | 
						;
 | 
				
			||||||
 | 
							( giri, fail ; true),
 | 
				
			||||||
 | 
							M is N - 1,
 | 
				
			||||||
 | 
							loop(M)
 | 
				
			||||||
 | 
						).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					memberchk_eq(A,[A1|_]) :- A == A1, !.
 | 
				
			||||||
 | 
					memberchk_eq(A,[_|L]) :-
 | 
				
			||||||
 | 
						memberchk_eq(A,L). 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										263
									
								
								LGPL/chr/Benchmarks/wfs.chr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										263
									
								
								LGPL/chr/Benchmarks/wfs.chr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,263 @@
 | 
				
			|||||||
 | 
					:- module(wfs,[main/0, main/1]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- use_module(library(chr)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- use_module(library(lists)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
				
			||||||
 | 
					%
 | 
				
			||||||
 | 
					% Schrijf het programma waarvan je de wellfounded semantics wil bepalen
 | 
				
			||||||
 | 
					% hieronder onder de vorm van prog/1 feiten. Let erop dat je een conjunctie
 | 
				
			||||||
 | 
					% in de body tussen haakjes zet zodat prog/1 geparsed wordt, ipv prog/n.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					prog((p :- p)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					prog((p :- \+ p)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					prog((p :- (q, \+ r))).
 | 
				
			||||||
 | 
					prog((q :- (r, \+ p))).
 | 
				
			||||||
 | 
					prog((r :- (p, \+ q))).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					prog((p :- r)).
 | 
				
			||||||
 | 
					prog((r :- q)).
 | 
				
			||||||
 | 
					prog((q :- \+ q)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					prog((p :- r)).
 | 
				
			||||||
 | 
					prog(r).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					prog((p :- p)).
 | 
				
			||||||
 | 
					prog((s :- \+ p)).
 | 
				
			||||||
 | 
					prog((y :- (s, \+ x))).
 | 
				
			||||||
 | 
					prog((x :- y)).
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					prog((a :- a)).
 | 
				
			||||||
 | 
					prog((b :- b)).
 | 
				
			||||||
 | 
					prog((b :- \+ a)).
 | 
				
			||||||
 | 
					prog((c :- \+ b)).
 | 
				
			||||||
 | 
					prog((c :- c)).
 | 
				
			||||||
 | 
					%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- chr_constraint true/1, false/1, undefined/1, aclause/2, pos/2, neg/2, nbulit/2, nbplit/2, nbucl/2, phase2/0, true2/1, undefined2/1, aclause2/2, pos2/2, nbplit2/2, phase1/0, witness1/0, witness2/0.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					true(At), aclause(Cl,At) \ pos(_,Cl) <=> true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					true(At), aclause(Cl,At) \ neg(_,Cl) <=> true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					false(At), aclause(Cl,At) \ pos(_,Cl) <=> true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					false(At), aclause(Cl,At) \ neg(_,Cl) <=> true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					true(At) \ nbucl(At,_) <=> true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					true(At) \ aclause(Cl,At), nbulit(Cl,_), nbplit(Cl,_) <=> true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					false(At) \ nbucl(At,_) <=> true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					nbucl(At,0) <=> false(At).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					aclause(Cl,At), nbulit(Cl,0), nbplit(Cl,0) <=> true(At).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					true(At) \ pos(At,Cl), nbulit(Cl,NU), nbplit(Cl,NP)
 | 
				
			||||||
 | 
						<=>
 | 
				
			||||||
 | 
							NU1 is NU - 1, nbulit(Cl,NU1),
 | 
				
			||||||
 | 
							NP1 is NP - 1, nbplit(Cl,NP1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					false(At) \ neg(At,Cl), nbulit(Cl,NU)
 | 
				
			||||||
 | 
						<=>
 | 
				
			||||||
 | 
							NU1 is NU - 1, nbulit(Cl,NU1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					true(At) \ neg(At,Cl), aclause(Cl,OAt), nbulit(Cl,_), nbplit(Cl,_), nbucl(OAt,N)
 | 
				
			||||||
 | 
						<=>
 | 
				
			||||||
 | 
							N1 is N - 1, nbucl(OAt,N1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					false(At) \ pos(At,Cl), aclause(Cl,OAt), nbulit(Cl,_), nbplit(Cl,_), nbucl(OAt,N)
 | 
				
			||||||
 | 
						<=>
 | 
				
			||||||
 | 
							N1 is N - 1, nbucl(OAt,N1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					witness2 \ witness2 <=> true.
 | 
				
			||||||
 | 
					phase2, nbucl(At,_)  ==> witness2, undefined2(At).
 | 
				
			||||||
 | 
					phase2, pos(At,Cl)   ==> pos2(At,Cl).
 | 
				
			||||||
 | 
					phase2, aclause(Cl,At)    ==> aclause2(Cl,At).
 | 
				
			||||||
 | 
					phase2, nbplit(Cl,N) ==> nbplit2(Cl,N).
 | 
				
			||||||
 | 
					phase2, witness2 # ID <=> phase1 pragma passive(ID).
 | 
				
			||||||
 | 
					phase2 \ nbplit2(_,_) # ID <=> true pragma passive(ID).
 | 
				
			||||||
 | 
					phase2 \ aclause2(_,_) # ID <=> true pragma passive(ID).
 | 
				
			||||||
 | 
					phase2 <=> true. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					true2(At), aclause2(Cl,At) \ pos2(_,Cl) <=> true.
 | 
				
			||||||
 | 
					true2(At) \ undefined2(At) <=> true.
 | 
				
			||||||
 | 
					aclause2(Cl,At), nbplit2(Cl,0) <=> true2(At).
 | 
				
			||||||
 | 
					true2(At) \ pos2(At,Cl), nbplit2(Cl,NP)
 | 
				
			||||||
 | 
						<=>
 | 
				
			||||||
 | 
							NP1 is NP - 1, nbplit2(Cl,NP1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					witness1 \ witness1 <=> true.
 | 
				
			||||||
 | 
					phase1, undefined2(At) # ID1 , aclause(Cl,At) # ID2 \ pos(_,Cl) # ID3 <=> true pragma passive(ID1), passive(ID2), passive(ID3).
 | 
				
			||||||
 | 
					phase1, undefined2(At) # ID1 , aclause(Cl,At) # ID2 \ neg(_,Cl) # ID3 <=> true pragma passive(ID1), passive(ID2), passive(ID3).
 | 
				
			||||||
 | 
					phase1, undefined2(At) # ID1 \ aclause(Cl,At) # ID2 , nbulit(Cl,_) # ID3, nbplit(Cl,_) # ID4 <=> true pragma passive(ID1), passive(ID2), passive(ID3), passive(ID4).
 | 
				
			||||||
 | 
					phase1 \ undefined2(At) # ID <=> witness1, false(At) pragma passive(ID).
 | 
				
			||||||
 | 
					phase1 \ true2(_) # ID <=> true pragma passive(ID).
 | 
				
			||||||
 | 
					phase1 \ aclause2(_,_) <=> true.
 | 
				
			||||||
 | 
					phase1 \ pos2(_,_) # ID <=> true pragma passive(ID).
 | 
				
			||||||
 | 
					phase1 \ nbplit2(_,_) # ID <=> true pragma passive(ID).
 | 
				
			||||||
 | 
					phase1, witness1 # ID  <=> phase2 pragma passive(ID).
 | 
				
			||||||
 | 
					phase1 \ nbucl(At,_) # ID <=> undefined(At) pragma passive(ID).
 | 
				
			||||||
 | 
					phase1 \ pos(_,_) # ID <=> true.
 | 
				
			||||||
 | 
					phase1 \ neg(_,_) # ID <=> true pragma passive(ID). 
 | 
				
			||||||
 | 
					phase1 \ aclause(_,_) # ID <=>  true pragma passive(ID). 
 | 
				
			||||||
 | 
					phase1 \ nbulit(_,_) # ID <=> true pragma passive(ID). 
 | 
				
			||||||
 | 
					phase1 \ nbplit(_,_) # ID <=> true pragma passive(ID). 
 | 
				
			||||||
 | 
					phase1 <=> true. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
						p :- r.
 | 
				
			||||||
 | 
						r.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					program1 :-
 | 
				
			||||||
 | 
						nbucl(p,1),		% aantal undefined clauses voor p
 | 
				
			||||||
 | 
						pos(r,cl1),		% positief voorkomen van r in clause cl1
 | 
				
			||||||
 | 
						aclause(cl1,p),		% clause cl1 defineert p
 | 
				
			||||||
 | 
						nbulit(cl1,1),		% aantal undefined literals in cl1
 | 
				
			||||||
 | 
						nbplit(cl1,1),		% aantal positieve undefined literals in cl1
 | 
				
			||||||
 | 
						nbucl(r,1),		
 | 
				
			||||||
 | 
						aclause(cl2,r),
 | 
				
			||||||
 | 
						nbulit(cl2,0),
 | 
				
			||||||
 | 
						nbplit(cl2,0).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
						p :- not r.
 | 
				
			||||||
 | 
						r.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					program2 :-
 | 
				
			||||||
 | 
						nbucl(p,1),
 | 
				
			||||||
 | 
						neg(r,cl1),
 | 
				
			||||||
 | 
						aclause(cl1,p),
 | 
				
			||||||
 | 
						nbulit(cl1,1),
 | 
				
			||||||
 | 
						nbplit(cl1,1),
 | 
				
			||||||
 | 
						nbucl(r,1),
 | 
				
			||||||
 | 
						aclause(cl2,r),
 | 
				
			||||||
 | 
						nbulit(cl2,0),
 | 
				
			||||||
 | 
						nbplit(cl2,0).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
						p :- p.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					program3 :-
 | 
				
			||||||
 | 
						nbucl(p,1),
 | 
				
			||||||
 | 
						pos(p,cl1),
 | 
				
			||||||
 | 
						aclause(cl1,p),
 | 
				
			||||||
 | 
						nbulit(cl1,1),
 | 
				
			||||||
 | 
						nbplit(cl1,1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
						p :- not p.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					program4 :-
 | 
				
			||||||
 | 
						nbucl(p,1),
 | 
				
			||||||
 | 
						neg(p,cl1),
 | 
				
			||||||
 | 
						aclause(cl1,p),
 | 
				
			||||||
 | 
						nbulit(cl1,1),
 | 
				
			||||||
 | 
						nbplit(cl1,0).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
						p :- q, not r.
 | 
				
			||||||
 | 
						q :- r, not p.
 | 
				
			||||||
 | 
						r :- p, not q.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					program5 :-
 | 
				
			||||||
 | 
						nbucl(p,1),
 | 
				
			||||||
 | 
						pos(p,cl3),
 | 
				
			||||||
 | 
						neg(p,cl2),
 | 
				
			||||||
 | 
						aclause(cl1,p),
 | 
				
			||||||
 | 
						nbulit(cl1,2),
 | 
				
			||||||
 | 
						nbplit(cl1,1),	
 | 
				
			||||||
 | 
						nbucl(q,1),
 | 
				
			||||||
 | 
						pos(q,cl1),
 | 
				
			||||||
 | 
						neg(q,cl3),
 | 
				
			||||||
 | 
						aclause(cl2,q),
 | 
				
			||||||
 | 
						nbulit(cl2,2),
 | 
				
			||||||
 | 
						nbplit(cl2,1),	
 | 
				
			||||||
 | 
						nbucl(r,1),	
 | 
				
			||||||
 | 
						pos(r,cl2),
 | 
				
			||||||
 | 
						neg(r,cl1),
 | 
				
			||||||
 | 
						aclause(cl3,r),
 | 
				
			||||||
 | 
						nbulit(cl3,2),
 | 
				
			||||||
 | 
						nbplit(cl3,1).	
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main :-
 | 
				
			||||||
 | 
						main(1000).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main(N) :-
 | 
				
			||||||
 | 
						cputime(T1),
 | 
				
			||||||
 | 
						loop(N),
 | 
				
			||||||
 | 
						cputime(T2),
 | 
				
			||||||
 | 
						T is T2 - T1,
 | 
				
			||||||
 | 
						write(bench(wfs ,N , T,0,hprolog)),write('.'),nl.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop(N) :-
 | 
				
			||||||
 | 
						( N =< 0 ->
 | 
				
			||||||
 | 
							true
 | 
				
			||||||
 | 
						;
 | 
				
			||||||
 | 
							( prog, fail ; true),
 | 
				
			||||||
 | 
							M is N - 1,
 | 
				
			||||||
 | 
							loop(M)
 | 
				
			||||||
 | 
						).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					prog :-
 | 
				
			||||||
 | 
						findall(Clause,wfs:prog(Clause),Clauses),
 | 
				
			||||||
 | 
						process(Clauses,1),
 | 
				
			||||||
 | 
						setof(At,B^(wfs:prog((At :- B)) ; wfs:prog(At), atom(At)),Ats),
 | 
				
			||||||
 | 
						process_atoms(Ats),
 | 
				
			||||||
 | 
						phase2.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					process([],_).
 | 
				
			||||||
 | 
					process([C|Cs],N) :-
 | 
				
			||||||
 | 
						( C = (HAt :- B) ->
 | 
				
			||||||
 | 
							aclause(N,HAt),
 | 
				
			||||||
 | 
							conj2list(B,Literals,[]),
 | 
				
			||||||
 | 
							process_literals(Literals,N,NbULit,NbPLit),
 | 
				
			||||||
 | 
							nbulit(N,NbULit),
 | 
				
			||||||
 | 
							nbplit(N,NbPLit)
 | 
				
			||||||
 | 
						;
 | 
				
			||||||
 | 
							C = HAt,
 | 
				
			||||||
 | 
							aclause(N,HAt),
 | 
				
			||||||
 | 
							nbulit(N,0),
 | 
				
			||||||
 | 
							nbplit(N,0)
 | 
				
			||||||
 | 
						),
 | 
				
			||||||
 | 
						N1 is N + 1,
 | 
				
			||||||
 | 
						process(Cs,N1).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					conj2list(G,L,T) :-
 | 
				
			||||||
 | 
						( G = (G1,G2) ->
 | 
				
			||||||
 | 
							conj2list(G1,L,T1),
 | 
				
			||||||
 | 
							conj2list(G2,T1,T)
 | 
				
			||||||
 | 
						;
 | 
				
			||||||
 | 
							L = [G|T]
 | 
				
			||||||
 | 
						).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					process_literals([],_,0,0).
 | 
				
			||||||
 | 
					process_literals([L|R],Cl,U,P) :-
 | 
				
			||||||
 | 
						process_literals(R,Cl,U1,P1),
 | 
				
			||||||
 | 
						( L = (\+ At) ->
 | 
				
			||||||
 | 
							neg(At,Cl),
 | 
				
			||||||
 | 
							P = P1,
 | 
				
			||||||
 | 
							U is U1 + 1
 | 
				
			||||||
 | 
						;
 | 
				
			||||||
 | 
							pos(L,Cl),
 | 
				
			||||||
 | 
							P is P1 + 1,
 | 
				
			||||||
 | 
							U is U1 + 1
 | 
				
			||||||
 | 
						).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					process_atoms([]).
 | 
				
			||||||
 | 
					process_atoms([A|As]) :-
 | 
				
			||||||
 | 
						findall(A,wfs:prog((A :- _)),L),
 | 
				
			||||||
 | 
						length(L,N),
 | 
				
			||||||
 | 
						nbucl(A,N),
 | 
				
			||||||
 | 
						process_atoms(As).
 | 
				
			||||||
							
								
								
									
										129
									
								
								LGPL/chr/Benchmarks/zebra.chr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								LGPL/chr/Benchmarks/zebra.chr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,129 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					:- module(zebra,[main/0, main/1]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- use_module(library(chr)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- use_module(library(lists)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*     
 | 
				
			||||||
 | 
					1.   The Englishman lives in the red house.
 | 
				
			||||||
 | 
					2.   The Spaniard owns the dog.
 | 
				
			||||||
 | 
					3.   Coffee is drunk in the green house.
 | 
				
			||||||
 | 
					4.   The Ukrainian drinks tea.
 | 
				
			||||||
 | 
					5.   The green house is immediately to the right of the ivory house.
 | 
				
			||||||
 | 
					6.   The Porsche driver owns snails.
 | 
				
			||||||
 | 
					7.   The Masserati is driven by the man who lives in the yellow house.
 | 
				
			||||||
 | 
					8.   Milk is drunk in the middle house.
 | 
				
			||||||
 | 
					9.   The Norwegian lives in the first house on the left.
 | 
				
			||||||
 | 
					10.  The man who drives a Saab lives in the house next to the man
 | 
				
			||||||
 | 
					     with the fox.
 | 
				
			||||||
 | 
					11.  The Masserati is driven by the man in the house next to the
 | 
				
			||||||
 | 
					     house where the horse is kept.
 | 
				
			||||||
 | 
					12.  The Honda driver drinks orange juice.
 | 
				
			||||||
 | 
					13.  The Japanese drives a Jaguar.
 | 
				
			||||||
 | 
					14.  The Norwegian lives next to the blue house.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:- chr_constraint domain/2, diff/2.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					domain(X,[]) <=> fail.
 | 
				
			||||||
 | 
					domain(X,[V]) <=> X = V.
 | 
				
			||||||
 | 
					domain(X,L1), domain(X,L2) <=> intersection(L1,L2,L3), domain(X,L3).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					diff(X,Y), domain(X,L) <=> nonvar(Y) | delete(L,Y,NL), domain(X,NL).
 | 
				
			||||||
 | 
					diff(X,Y) <=> nonvar(X), nonvar(Y) | X \== Y.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all_different([]). 
 | 
				
			||||||
 | 
					all_different([H|T]) :-
 | 
				
			||||||
 | 
						all_different(T,H),
 | 
				
			||||||
 | 
						all_different(T).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all_different([],_).
 | 
				
			||||||
 | 
					all_different([H|T],E) :-
 | 
				
			||||||
 | 
						diff(H,E),
 | 
				
			||||||
 | 
						diff(E,H),
 | 
				
			||||||
 | 
						all_different(T,E).
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					main :-
 | 
				
			||||||
 | 
						main(10).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main(N):-
 | 
				
			||||||
 | 
						cputime(X),
 | 
				
			||||||
 | 
						test(N),
 | 
				
			||||||
 | 
						cputime( Now),
 | 
				
			||||||
 | 
						Time is Now-X,
 | 
				
			||||||
 | 
						write(bench(zebra, N,Time,0,hprolog)), write('.'),nl.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test(N) :-
 | 
				
			||||||
 | 
					        ( N > 0 ->
 | 
				
			||||||
 | 
					                solve,!,
 | 
				
			||||||
 | 
					                M is N - 1,
 | 
				
			||||||
 | 
					                test(M)
 | 
				
			||||||
 | 
					        ;
 | 
				
			||||||
 | 
							true
 | 
				
			||||||
 | 
					        ).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					solve :-
 | 
				
			||||||
 | 
						[ [ ACo, AN, ACa, AD, AP ],
 | 
				
			||||||
 | 
						  [ BCo, BN, BCa, BD, BP ],
 | 
				
			||||||
 | 
						  [ CCo, CN, CCa, CD, CP ],
 | 
				
			||||||
 | 
						  [ DCo, DN, DCa, DD, DP ],
 | 
				
			||||||
 | 
						  [ ECo, EN, ECa, ED, EP ] ] = S,
 | 
				
			||||||
 | 
						domain(ACo,[red,green,ivory,yellow,blue]),
 | 
				
			||||||
 | 
						domain(BCo,[red,green,ivory,yellow,blue]),
 | 
				
			||||||
 | 
						domain(CCo,[red,green,ivory,yellow,blue]),
 | 
				
			||||||
 | 
						domain(DCo,[red,green,ivory,yellow,blue]),
 | 
				
			||||||
 | 
						domain(ECo,[red,green,ivory,yellow,blue]),
 | 
				
			||||||
 | 
						domain(AN ,[english,spanish,ukranian,norwegian,japanese]),
 | 
				
			||||||
 | 
						domain(BN ,[english,spanish,ukranian,norwegian,japanese]),
 | 
				
			||||||
 | 
						domain(CN ,[english,spanish,ukranian,norwegian,japanese]),
 | 
				
			||||||
 | 
						domain(DN ,[english,spanish,ukranian,norwegian,japanese]),
 | 
				
			||||||
 | 
						domain(EN ,[english,spanish,ukranian,norwegian,japanese]),
 | 
				
			||||||
 | 
						domain(ACa,[porsche,masserati,saab,honda,jaguar]),
 | 
				
			||||||
 | 
						domain(BCa,[porsche,masserati,saab,honda,jaguar]),
 | 
				
			||||||
 | 
						domain(CCa,[porsche,masserati,saab,honda,jaguar]),
 | 
				
			||||||
 | 
						domain(DCa,[porsche,masserati,saab,honda,jaguar]),
 | 
				
			||||||
 | 
						domain(ECa,[porsche,masserati,saab,honda,jaguar]),
 | 
				
			||||||
 | 
						domain(AD ,[coffee,tea,milk,orange,water]),
 | 
				
			||||||
 | 
						domain(BD ,[coffee,tea,milk,orange,water]),
 | 
				
			||||||
 | 
						domain(CD ,[coffee,tea,milk,orange,water]),
 | 
				
			||||||
 | 
						domain(DD ,[coffee,tea,milk,orange,water]),
 | 
				
			||||||
 | 
						domain(ED ,[coffee,tea,milk,orange,water]),
 | 
				
			||||||
 | 
						domain(AP ,[dog,snails,fox,horse,zebra]),
 | 
				
			||||||
 | 
						domain(BP ,[dog,snails,fox,horse,zebra]),
 | 
				
			||||||
 | 
						domain(CP ,[dog,snails,fox,horse,zebra]),
 | 
				
			||||||
 | 
						domain(DP ,[dog,snails,fox,horse,zebra]),
 | 
				
			||||||
 | 
						domain(EP ,[dog,snails,fox,horse,zebra]),
 | 
				
			||||||
 | 
						all_different([ACo,BCo,CCo,DCo,ECo]),
 | 
				
			||||||
 | 
						all_different([AN ,BN ,CN ,DN ,EN ]),
 | 
				
			||||||
 | 
						all_different([ACa,BCa,CCa,DCa,ECa]),
 | 
				
			||||||
 | 
						all_different([AD ,BD ,CD ,DD ,ED ]),
 | 
				
			||||||
 | 
						all_different([AP ,BP ,CP ,DP ,EP ]),
 | 
				
			||||||
 | 
						[_,_,[_,_,_,milk,_],_,_]           = S,  % clue 8
 | 
				
			||||||
 | 
					        [[_,norwegian,_,_,_],_,_,_,_]      = S , % clue 9
 | 
				
			||||||
 | 
					        member( [green,_,_,coffee,_],                S), % clue 3
 | 
				
			||||||
 | 
					        member( [red,english,_,_,_],              S), % clue 1
 | 
				
			||||||
 | 
					        member( [_,ukranian,_,tea,_],                S), % clue 4
 | 
				
			||||||
 | 
					        member( [yellow,_,masserati,_,_],            S), % clue 7
 | 
				
			||||||
 | 
					        member( [_,_,honda,orange,_],          S), % clue 12
 | 
				
			||||||
 | 
					        member( [_,japanese,jaguar,_,_],             S), % clue 13
 | 
				
			||||||
 | 
					        member( [_,spanish,_,_,dog],                S), % clue 2
 | 
				
			||||||
 | 
					        member( [_,_,porsche,_,snails],              S), % clue 6
 | 
				
			||||||
 | 
					        left_right( [ivory,_,_,_,_],    [green,_,_,_,_], S), % clue 5
 | 
				
			||||||
 | 
					        next_to( [_,norwegian,_,_,_],[blue,_,_,_,_],  S), % clue 14
 | 
				
			||||||
 | 
					        next_to( [_,_,masserati,_,_],[_,_,_,_,horse], S), % clue 11
 | 
				
			||||||
 | 
					        next_to( [_,_,saab,_,_],     [_,_,_,_,fox],   S), % clue 10
 | 
				
			||||||
 | 
						true.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					% left_right(L, R, X) is true when L is to the immediate left of R in list X
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					left_right(L, R, [L, R | _]).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					left_right(L, R, [_ | X]) :- left_right(L, R, X).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					% next_to(X, Y, L) is true when X and Y are next to each other in list L
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					next_to(X, Y, L) :- left_right(X, Y, L).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					next_to(X, Y, L) :- left_right(Y, X, L).
 | 
				
			||||||
		Reference in New Issue
	
	Block a user