Deleted CHR
This commit is contained in:
		@@ -1,25 +0,0 @@
 | 
				
			|||||||
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.
 | 
					 | 
				
			||||||
@@ -1,323 +0,0 @@
 | 
				
			|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%% 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]).
 | 
					 | 
				
			||||||
@@ -1,34 +0,0 @@
 | 
				
			|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%% 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.
 | 
					 | 
				
			||||||
                 
 | 
					 | 
				
			||||||
@@ -1,42 +0,0 @@
 | 
				
			|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%% 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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,138 +0,0 @@
 | 
				
			|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%% 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).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,34 +0,0 @@
 | 
				
			|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%% 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).
 | 
					 | 
				
			||||||
@@ -1,30 +0,0 @@
 | 
				
			|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%% 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.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,386 +0,0 @@
 | 
				
			|||||||
:- 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). 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,263 +0,0 @@
 | 
				
			|||||||
:- 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).
 | 
					 | 
				
			||||||
@@ -1,129 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
:- 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).
 | 
					 | 
				
			||||||
@@ -1,208 +0,0 @@
 | 
				
			|||||||
Sep 2, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Synchronized with hProlog.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Aug 31, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Added missing operator declarations for prefix (?).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Aug 9, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: import lists into chr_compiler_utility.pl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: make message hook for query(yes) detect CHR global variables.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: Exported pairlist_delete_eq/3 from pairlist and use this in
 | 
					 | 
				
			||||||
    chr_hashtable_store.pl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Aug 4, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Renamed pairlist:delete/3 to pairlist:pairlist_delete/3.
 | 
					 | 
				
			||||||
	Mike Elston.
 | 
					 | 
				
			||||||
Aug 1, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Extended more efficient ground matching code to
 | 
					 | 
				
			||||||
	removed simpagation occurrence code.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Jul 28, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: New input verification: duplicate constraint declaration
 | 
					 | 
				
			||||||
	now reported as an error. Requested by Mike Elston.
 | 
					 | 
				
			||||||
  * TS: More efficient matching code for ground constraints
 | 
					 | 
				
			||||||
	when matching an argument of a partner constraint with
 | 
					 | 
				
			||||||
	a ground term
 | 
					 | 
				
			||||||
  * JS: Bug fix in guard simplification.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Jul 3, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Factored out option functionality into separate module.
 | 
					 | 
				
			||||||
  * TS: Factored out utility code into separate module.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Jun 29, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Changed chr_show_store/1 to use print/1 instead of write/1.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Jun 28, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Removed spurious and conflicting operator definitions
 | 
					 | 
				
			||||||
	for +, - and ? as mode declarations.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Jun 27, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Added find_chr_constraint/1 functionality.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Jun 8, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Improved compiler scalability: use nb_setval/2 to
 | 
					 | 
				
			||||||
        remember compiled code through backtracking over
 | 
					 | 
				
			||||||
	compilation process instead of assert/1.
 | 
					 | 
				
			||||||
  * TS: Removed spurious comma from file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Jun 1, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Added option to disable toplevel constraint store printing.
 | 
					 | 
				
			||||||
  * TS: Slightly improved hash table constraint store implementation.
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
Apr 16, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: Added patch from Jon Sneyers.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Mar 11, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Improved head reordering heuristic.
 | 
					 | 
				
			||||||
  * TS: Added support primitive for alternate built-in solver dependency.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Mar 4, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Fixed bug that causes wrong output in chr_show_store.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Feb 25, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Fixed several bugs in generation of debugable code.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Feb 19, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: Cleanup integration in SWI-Prolog environment:
 | 
					 | 
				
			||||||
	- Extended SWI-Prolog library ordsets.  Renamed ord_delete/3 to
 | 
					 | 
				
			||||||
	  ord_del_element/3 and ord_difference/3 to ord_subtract/3 for
 | 
					 | 
				
			||||||
	  better compatibility.
 | 
					 | 
				
			||||||
	- Renamed module find to chr_find to avoid name conflict and declared
 | 
					 | 
				
			||||||
	  preds as meta-predicate.
 | 
					 | 
				
			||||||
	- Re-inserted and exported strip_attributes/2 and
 | 
					 | 
				
			||||||
	  restore_attributes/2 in hprolog.pl. Deleted hprolog: from
 | 
					 | 
				
			||||||
	  chr_translate.chr.
 | 
					 | 
				
			||||||
	- Added dummy option declarations to bootstrap compiler.
 | 
					 | 
				
			||||||
	- Fixed path problems in makefile (-p chr=.) and install new
 | 
					 | 
				
			||||||
	  components.
 | 
					 | 
				
			||||||
	- Fixed typo 'chr show_store' --> chr_show_store.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Feb 17, 2005
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JS: Added guard entailment optimizations and
 | 
					 | 
				
			||||||
	new syntax for type and mode declarations.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Dec 15, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Use prolog:message/3 hook to automatically print
 | 
					 | 
				
			||||||
	contents of CHR constraint stores with query bindings
 | 
					 | 
				
			||||||
	on toplevel.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Dec  3, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Bugfix in code generation. Reported by Lyosha Ilyukhin.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Jul 28, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Updated hashtable stores. They now start small and expand.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Jul 19, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: Removed chr_pp: module prefixes
 | 
					 | 
				
			||||||
  * JW: Updated Windows makefile.mak (more similar organisation, added check)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Jul 17, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Added chr_hashtable_store library.
 | 
					 | 
				
			||||||
  * TS: Added find library.
 | 
					 | 
				
			||||||
  * TS: Added builtins library.
 | 
					 | 
				
			||||||
  * TS: Added clean_code library.
 | 
					 | 
				
			||||||
  * TS: Added binomial_heap library.
 | 
					 | 
				
			||||||
  * TS: Added a_star library.
 | 
					 | 
				
			||||||
  * TS: Added new intermediate bootstrapping step
 | 
					 | 
				
			||||||
  * TS: Synchronized CHR compiler with most recent development version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  Summary of changes:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   "The new version of the compiler contains several new optimizations, both
 | 
					 | 
				
			||||||
    fully automatic, such as the antimonotny-based delay avoidance (see
 | 
					 | 
				
			||||||
    http://www.cs.kuleuven.ac.be/publicaties/rapporten/cw/CW385.abs.html for
 | 
					 | 
				
			||||||
    the technical report), and enabled by mode declarations (see CHR
 | 
					 | 
				
			||||||
    documentation), such as hashtable-based constraint indexes."
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Apr 9, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: Added chr_messages.pl.  Make all debug messages use the print_message/2
 | 
					 | 
				
			||||||
    interface to enable future embedding.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Apr 7, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: Added chr:debug_interact/3 hook.  Defined in chr_swi.pl to void
 | 
					 | 
				
			||||||
    showing constraints first as goal and then as CHR call.
 | 
					 | 
				
			||||||
  * JW: Added chr:debug_event/2 hook.  Defined in chr_swi.pl to make the
 | 
					 | 
				
			||||||
    CHR debugger honour a skip command from the Prolog tracer.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Apr 6, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: Added b (break) to the CHR debugger.
 | 
					 | 
				
			||||||
  * TS: added chr_expandable/2 clause for pragma/2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Apr 5, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: fixed reference to format_rule/2.
 | 
					 | 
				
			||||||
  * JW: Use select/3 rather than delete/3 in diff/2 in Tests/zebra.pl
 | 
					 | 
				
			||||||
  * TS: CHR translation now leaves CHR store empty
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Apr 4, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: added :- use_module(library(chr)) to all examples.
 | 
					 | 
				
			||||||
  * JW: mapped -O --> option(optimize, full).
 | 
					 | 
				
			||||||
  * JW: introduced file-search-path `chr' for clarity and to enable running
 | 
					 | 
				
			||||||
    make check from the local environment instead of the public installation.
 | 
					 | 
				
			||||||
  * JW: mapped prolog flag generate_debug_info --> option(debug, on)
 | 
					 | 
				
			||||||
  * JW: Replaced the chr -> pl step with term_expansion/2.
 | 
					 | 
				
			||||||
  * JW: Moved insert_declarations/2 to chr_swi.pl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Apr 2, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: fixed Undefined procedure: chr_runtime:run_suspensions_loop_d/1
 | 
					 | 
				
			||||||
  * TS: Added <space> for creep and shortened debug line prefix to CHR:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Mar 29, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: Use \+ \+ in chr_compile/3 to undo changes to the constraint
 | 
					 | 
				
			||||||
    pool.  Regression test suite using "make check" works again.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Mar 25, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Added skip and ancestor debug commands
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Mar 24, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * TS: Added bootstrapping process for CHR compiler using CHR.
 | 
					 | 
				
			||||||
  * TS: CHR compiler now uses CHR.
 | 
					 | 
				
			||||||
  * TS: Fixed bug in compilation of multi-headed simpagation rules.
 | 
					 | 
				
			||||||
  * TS: Cleaned up compiler.
 | 
					 | 
				
			||||||
  * TS: Added analysis + optimization for never attached constraints.
 | 
					 | 
				
			||||||
  * TS: Exploit uniqueness (functional dependency) results to detect
 | 
					 | 
				
			||||||
    set semantics type simpagation rules where one rule can be passive
 | 
					 | 
				
			||||||
  * TS: Compiler generates 'chr debug_event'/1 calls
 | 
					 | 
				
			||||||
  * TS: Rudimentary support for debugging.
 | 
					 | 
				
			||||||
    option(debug,on) causes a trace of CHR events to be printed
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Mar 15, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: Fix operator handling.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Mar 3, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  * JW: Integrated new version from Tom Schrijvers.
 | 
					 | 
				
			||||||
@@ -1,157 +0,0 @@
 | 
				
			|||||||
#
 | 
					 | 
				
			||||||
# default base directory for YAP installation
 | 
					 | 
				
			||||||
# (EROOT for architecture-dependent files)
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
prefix = @prefix@
 | 
					 | 
				
			||||||
ROOTDIR = $(prefix)
 | 
					 | 
				
			||||||
EROOTDIR = @exec_prefix@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
srcdir=@srcdir@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
BINDIR = $(EROOTDIR)/bin
 | 
					 | 
				
			||||||
LIBDIR=$(EROOTDIR)/lib
 | 
					 | 
				
			||||||
YAPLIBDIR=$(EROOTDIR)/lib/Yap
 | 
					 | 
				
			||||||
SHAREDIR=$(ROOTDIR)/share
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SHELL=@SHELL@
 | 
					 | 
				
			||||||
PL=@EXTEND_DYNLOADER_PATH@ $(DESTDIR)$(BINDIR)/yap $(DESTDIR)$(YAPLIBDIR)/startup 
 | 
					 | 
				
			||||||
CHRDIR=$(SHAREDIR)/chr
 | 
					 | 
				
			||||||
EXDIR=$(CHRDIR)/examples/chr
 | 
					 | 
				
			||||||
LN_S=@LN_S@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DOCTOTEX=$(PCEHOME)/bin/doc2tex
 | 
					 | 
				
			||||||
PLTOTEX=$(PCEHOME)/bin/pl2tex
 | 
					 | 
				
			||||||
LATEX=latex
 | 
					 | 
				
			||||||
DOC=chr
 | 
					 | 
				
			||||||
TEX=$(DOC).tex
 | 
					 | 
				
			||||||
DVI=$(DOC).dvi
 | 
					 | 
				
			||||||
PDF=$(DOC).pdf
 | 
					 | 
				
			||||||
HTML=$(DOC).html
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTALL=@INSTALL@
 | 
					 | 
				
			||||||
INSTALL_PROGRAM=@INSTALL_PROGRAM@
 | 
					 | 
				
			||||||
INSTALL_DATA=@INSTALL_DATA@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LIBPL=		$(srcdir)/chr_runtime.pl $(srcdir)/chr_op.pl chr_translate.pl $(srcdir)/chr_debug.pl \
 | 
					 | 
				
			||||||
		$(srcdir)/chr_messages.pl $(srcdir)/hprolog.pl $(srcdir)/pairlist.pl $(srcdir)/clean_code.pl \
 | 
					 | 
				
			||||||
		$(srcdir)/find.pl $(srcdir)/a_star.pl $(srcdir)/binomialheap.pl $(srcdir)/builtins.pl \
 | 
					 | 
				
			||||||
		$(srcdir)/chr_hashtable_store.pl $(srcdir)/listmap.pl guard_entailment.pl \
 | 
					 | 
				
			||||||
		$(srcdir)/chr_compiler_errors.pl \
 | 
					 | 
				
			||||||
		$(srcdir)/chr_compiler_options.pl $(srcdir)/chr_compiler_utility.pl \
 | 
					 | 
				
			||||||
		$(srcdir)/chr_integertable_store.pl
 | 
					 | 
				
			||||||
CHRPL=		$(srcdir)/chr_swi.pl
 | 
					 | 
				
			||||||
EXAMPLES=	$(srcdir)/Benchmarks/chrfreeze.chr $(srcdir)/Benchmarks/fib.chr $(srcdir)/Benchmarks/gcd.chr $(srcdir)/Benchmarks/primes.chr \
 | 
					 | 
				
			||||||
		$(srcdir)/Benchmarks/bool.chr $(srcdir)/Benchmarks/family.chr $(srcdir)/Benchmarks/fibonacci.chr $(srcdir)/Benchmarks/leq.chr $(srcdir)/Benchmarks/listdom.chr \
 | 
					 | 
				
			||||||
		$(srcdir)/Benchmarks/chrdif.chr
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GPLDIR=		$(srcdir)/../../GPL
 | 
					 | 
				
			||||||
LGPLDIR=	$(srcdir)/../../LGPL
 | 
					 | 
				
			||||||
EXTRALIBDIR=	$(srcdir)/../../library
 | 
					 | 
				
			||||||
GPLLIBPL=	$(EXTRALIBDIR)/aggregate.pl $(EXTRALIBDIR)/error.pl $(EXTRALIBDIR)/occurs.yap $(EXTRALIBDIR)/pairs.pl 
 | 
					 | 
				
			||||||
LGPLLIBPL=	$(EXTRALIBDIR)/maplist.pl
 | 
					 | 
				
			||||||
EXTRALIBPL=	$(GPLLIBPL) $(LGPLLIBPL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
all:		chr_translate.pl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_translate_bootstrap1.pl: $(srcdir)/chr_translate_bootstrap1.chr $(EXTRALIBPL)
 | 
					 | 
				
			||||||
		$(PL) -f -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step1('$<','$@'),halt." \
 | 
					 | 
				
			||||||
		      -z 'halt(1).'
 | 
					 | 
				
			||||||
		$(PL) -f -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step2('$<','$@'),halt." \
 | 
					 | 
				
			||||||
		      -z 'halt(1).'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_translate_bootstrap2.pl: $(srcdir)/chr_translate_bootstrap2.chr  chr_translate_bootstrap1.pl
 | 
					 | 
				
			||||||
		$(PL) -f -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step2('$<','$@'),halt." \
 | 
					 | 
				
			||||||
		      -z 'halt(1).'
 | 
					 | 
				
			||||||
		$(PL) -f -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step3('$<','$@'),halt." \
 | 
					 | 
				
			||||||
		      -z 'halt(1).'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
guard_entailment.pl: $(srcdir)/guard_entailment.chr chr_translate_bootstrap2.pl 
 | 
					 | 
				
			||||||
		$(PL) -f -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step3('$<','$@'),halt." \
 | 
					 | 
				
			||||||
		      -z 'halt(1).'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_translate.pl: $(srcdir)/chr_translate.chr chr_translate_bootstrap2.pl guard_entailment.pl
 | 
					 | 
				
			||||||
		$(PL) -f -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step3('$<','$@'),halt." \
 | 
					 | 
				
			||||||
		      -z 'halt(1).'
 | 
					 | 
				
			||||||
		$(PL) -f -p chr=. -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step4('guard_entailment.chr','guard_entailment.pl'),halt." \
 | 
					 | 
				
			||||||
		      -z 'halt(1).'
 | 
					 | 
				
			||||||
		$(PL) -f -p chr=. -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step4('$<','$@'),halt." \
 | 
					 | 
				
			||||||
		      -z 'halt(1).'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr.pl:		chr_swi.pl
 | 
					 | 
				
			||||||
		cp $< $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(GPLLIBPL): $(EXTRALIBDIR)/%: $(GPLDIR)/%
 | 
					 | 
				
			||||||
		cp $< $@
 | 
					 | 
				
			||||||
$(LGPLLIBPL): $(EXTRALIBDIR)/%: $(LGPLDIR)/%
 | 
					 | 
				
			||||||
		cp $< $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install:	chr_translate.pl guard_entailment.pl
 | 
					 | 
				
			||||||
		mkdir -p $(DESTDIR)$(CHRDIR)
 | 
					 | 
				
			||||||
		$(INSTALL) -m 644 $(LIBPL) $(DESTDIR)$(CHRDIR)
 | 
					 | 
				
			||||||
		$(INSTALL) -m 644 $(CHRPL) $(DESTDIR)$(SHAREDIR)/chr.pl
 | 
					 | 
				
			||||||
		$(INSTALL) -m 644 $(srcdir)/README   $(DESTDIR)$(CHRDIR)
 | 
					 | 
				
			||||||
#		$(PL) -f -g make -z halt
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
rpm-install:	install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pdf-install:	install-examples
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
html-install:	install-examples
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install-examples::
 | 
					 | 
				
			||||||
		mkdir -p $(DESTDIR)$(EXDIR)
 | 
					 | 
				
			||||||
		(cd Examples && $(INSTALL_DATA) $(EXAMPLES) $(DESTDIR)$(EXDIR))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall:
 | 
					 | 
				
			||||||
		(cd $(PLBASE)/library && rm -f $(LIBPL))
 | 
					 | 
				
			||||||
		$(PL) -f none -g make -t halt
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
check:		chr.pl
 | 
					 | 
				
			||||||
		$(PL) -f chr_test.pl -g test,halt -t 'halt(1)'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
################################################################
 | 
					 | 
				
			||||||
# Documentation
 | 
					 | 
				
			||||||
################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
doc:		$(PDF) $(HTML)
 | 
					 | 
				
			||||||
pdf:		$(PDF)
 | 
					 | 
				
			||||||
html:		$(HTML)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(HTML):	$(TEX)
 | 
					 | 
				
			||||||
		latex2html $(DOC)
 | 
					 | 
				
			||||||
		mv html/index.html $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(PDF):		$(TEX)
 | 
					 | 
				
			||||||
		runtex --pdf $(DOC)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(TEX):		$(DOCTOTEX)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.doc.tex:
 | 
					 | 
				
			||||||
		$(DOCTOTEX) $*.doc > $*.tex
 | 
					 | 
				
			||||||
.pl.tex:
 | 
					 | 
				
			||||||
		$(PLTOTEX) $*.pl > $*.tex
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
################################################################
 | 
					 | 
				
			||||||
# Clean
 | 
					 | 
				
			||||||
################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean:
 | 
					 | 
				
			||||||
		rm -f *~ *% config.log
 | 
					 | 
				
			||||||
		rm -f chr.pl chr_translate.pl
 | 
					 | 
				
			||||||
		rm -f chr_translate_bootstrap1.pl chr_translate_bootstrap2.pl
 | 
					 | 
				
			||||||
		rm -f guard_entailment.pl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
distclean:	clean
 | 
					 | 
				
			||||||
		rm -f $(TARGETS) config.h config.cache config.status Makefile
 | 
					 | 
				
			||||||
		rm -f $(TEX)
 | 
					 | 
				
			||||||
		runtex --clean $(DOC)
 | 
					 | 
				
			||||||
@@ -1,141 +0,0 @@
 | 
				
			|||||||
################################################################
 | 
					 | 
				
			||||||
# SWI-Prolog CHR package
 | 
					 | 
				
			||||||
# Author:    Jan Wielemaker. jan@swi.psy.uva.nl
 | 
					 | 
				
			||||||
# Copyright: LGPL (see COPYING or www.gnu.org
 | 
					 | 
				
			||||||
################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.SUFFIXES: .tex .dvi .doc .pl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SHELL=/bin/sh
 | 
					 | 
				
			||||||
PLBASE=/usr/lib/pl-5.5.31
 | 
					 | 
				
			||||||
#PL=~/Yap/bins/devel/yap
 | 
					 | 
				
			||||||
PL=~/osx/yap
 | 
					 | 
				
			||||||
XPCEBASE=$(PLBASE)/xpce
 | 
					 | 
				
			||||||
PKGDOC=$(PLBASE)/doc/packages
 | 
					 | 
				
			||||||
PCEHOME=../../xpce
 | 
					 | 
				
			||||||
LIBDIR=$(PLBASE)/library
 | 
					 | 
				
			||||||
CHRDIR=$(LIBDIR)/chr
 | 
					 | 
				
			||||||
EXDIR=$(PKGDOC)/examples/chr
 | 
					 | 
				
			||||||
DESTDIR=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DOCTOTEX=$(PCEHOME)/bin/doc2tex
 | 
					 | 
				
			||||||
PLTOTEX=$(PCEHOME)/bin/pl2tex
 | 
					 | 
				
			||||||
LATEX=latex
 | 
					 | 
				
			||||||
DOC=chr
 | 
					 | 
				
			||||||
TEX=$(DOC).tex
 | 
					 | 
				
			||||||
DVI=$(DOC).dvi
 | 
					 | 
				
			||||||
PDF=$(DOC).pdf
 | 
					 | 
				
			||||||
HTML=$(DOC).html
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INSTALL=/usr/bin/install -c
 | 
					 | 
				
			||||||
INSTALL_PROGRAM=${INSTALL}
 | 
					 | 
				
			||||||
INSTALL_DATA=/usr/bin/install -c -m 644
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LIBPL=		chr_runtime.pl chr_op.pl chr_translate.pl chr_debug.pl \
 | 
					 | 
				
			||||||
		chr_messages.pl hprolog.pl pairlist.pl clean_code.pl \
 | 
					 | 
				
			||||||
		find.pl a_star.pl binomialheap.pl builtins.pl \
 | 
					 | 
				
			||||||
		chr_hashtable_store.pl listmap.pl guard_entailment.pl \
 | 
					 | 
				
			||||||
		chr_compiler_options.pl chr_compiler_utility.pl
 | 
					 | 
				
			||||||
CHRPL=		chr_swi.pl
 | 
					 | 
				
			||||||
EXAMPLES=	chrfreeze.chr fib.chr gcd.chr primes.chr \
 | 
					 | 
				
			||||||
		bool.chr family.chr fibonacci.chr leq.chr listdom.chr \
 | 
					 | 
				
			||||||
		chrdif.chr
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
all:		chr_translate.pl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_translate_bootstrap1.pl: chr_translate_bootstrap1.chr 
 | 
					 | 
				
			||||||
		$(PL) -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step1('$<','$@'),halt." \
 | 
					 | 
				
			||||||
		      -z 'halt(1).'
 | 
					 | 
				
			||||||
		$(PL) -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step2('$<','$@'),halt." \
 | 
					 | 
				
			||||||
		      -z 'halt(1).'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_translate_bootstrap2.pl: chr_translate_bootstrap2.chr chr_translate_bootstrap1.pl 
 | 
					 | 
				
			||||||
		$(PL) -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step2('$<','$@'),halt." \
 | 
					 | 
				
			||||||
		      -z  'halt(1).'
 | 
					 | 
				
			||||||
		$(PL) -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step3('$<','$@'),halt." \
 | 
					 | 
				
			||||||
		      -z  'halt(1).'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
guard_entailment.pl: guard_entailment.chr chr_translate_bootstrap2.pl 
 | 
					 | 
				
			||||||
		$(PL) -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step3('$<','$@'),halt." \
 | 
					 | 
				
			||||||
		      -z  'halt(1).'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_translate.pl: chr_translate.chr chr_translate_bootstrap2.pl guard_entailment.pl
 | 
					 | 
				
			||||||
		$(PL) -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step3('$<','$@'),halt." \
 | 
					 | 
				
			||||||
		      -z  'halt(1)'
 | 
					 | 
				
			||||||
		$(PL) -p chr=. -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step4('guard_entailment.chr','guard_entailment.pl'),halt." \
 | 
					 | 
				
			||||||
		      -z  'halt(1).'
 | 
					 | 
				
			||||||
		$(PL) -p chr=. -l chr_swi_bootstrap.yap \
 | 
					 | 
				
			||||||
		      -g "chr_compile_step4('$<','$@'),halt." \
 | 
					 | 
				
			||||||
		      -z  'halt(1).'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr.pl:		chr_swi.pl
 | 
					 | 
				
			||||||
		cp $< $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install:	$(LIBPL)
 | 
					 | 
				
			||||||
		mkdir -p $(DESTDIR)$(CHRDIR)
 | 
					 | 
				
			||||||
		$(INSTALL) -m 644 $(LIBPL) $(DESTDIR)$(CHRDIR)
 | 
					 | 
				
			||||||
		$(INSTALL) -m 644 $(CHRPL) $(DESTDIR)$(LIBDIR)/chr.pl
 | 
					 | 
				
			||||||
		$(INSTALL) -m 644 README   $(DESTDIR)$(CHRDIR)
 | 
					 | 
				
			||||||
		$(PL) -f none -g make -z  halt
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
rpm-install:	install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pdf-install:	install-examples
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
html-install:	install-examples
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install-examples::
 | 
					 | 
				
			||||||
		mkdir -p $(DESTDIR)$(EXDIR)
 | 
					 | 
				
			||||||
		(cd Examples && $(INSTALL_DATA) $(EXAMPLES) $(DESTDIR)$(EXDIR))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
uninstall:
 | 
					 | 
				
			||||||
		(cd $(PLBASE)/library && rm -f $(LIBPL))
 | 
					 | 
				
			||||||
		$(PL) -f none -g make -z  halt
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
check:		chr.pl
 | 
					 | 
				
			||||||
		$(PL) -f chr_test.pl -g "test,halt." -z  'halt(1).'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
################################################################
 | 
					 | 
				
			||||||
# Documentation
 | 
					 | 
				
			||||||
################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
doc:		$(PDF) $(HTML)
 | 
					 | 
				
			||||||
pdf:		$(PDF)
 | 
					 | 
				
			||||||
html:		$(HTML)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(HTML):	$(TEX)
 | 
					 | 
				
			||||||
		latex2html $(DOC)
 | 
					 | 
				
			||||||
		mv html/index.html $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(PDF):		$(TEX)
 | 
					 | 
				
			||||||
		runtex --pdf $(DOC)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(TEX):		$(DOCTOTEX)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.doc.tex:
 | 
					 | 
				
			||||||
		$(DOCTOTEX) $*.doc > $*.tex
 | 
					 | 
				
			||||||
.pl.tex:
 | 
					 | 
				
			||||||
		$(PLTOTEX) $*.pl > $*.tex
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
################################################################
 | 
					 | 
				
			||||||
# Clean
 | 
					 | 
				
			||||||
################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean:
 | 
					 | 
				
			||||||
		rm -f *~ *% config.log
 | 
					 | 
				
			||||||
		rm -f chr.pl chr_translate.pl
 | 
					 | 
				
			||||||
		rm -f chr_translate_bootstrap1.pl chr_translate_bootstrap2.pl
 | 
					 | 
				
			||||||
		rm -f guard_entailment.pl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
distclean:	clean
 | 
					 | 
				
			||||||
		rm -f $(TARGETS) config.h config.cache config.status Makefile
 | 
					 | 
				
			||||||
		rm -f $(TEX)
 | 
					 | 
				
			||||||
		runtex --clean $(DOC)
 | 
					 | 
				
			||||||
@@ -1,47 +0,0 @@
 | 
				
			|||||||
				CHR for SWI-Prolog
 | 
					 | 
				
			||||||
				==================
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Authors and license
 | 
					 | 
				
			||||||
====================
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
This package contains code  from  the   following  authors.  All code is
 | 
					 | 
				
			||||||
distributed under the SWI-Prolog  conditions   with  permission from the
 | 
					 | 
				
			||||||
authors.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	* Tom Schrijvers, K.U.Leuven	Tom.Schrijvers@cs.kuleuven.ac
 | 
					 | 
				
			||||||
	* Christian Holzbaur		christian@ai.univie.ac.at
 | 
					 | 
				
			||||||
	* Jan Wielemaker 		jan@swi-prolog.org
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Files and their roles:
 | 
					 | 
				
			||||||
======================
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# library(chr)			chr_swi.pl
 | 
					 | 
				
			||||||
	Make user-predicates and hooks for loading CHR files available
 | 
					 | 
				
			||||||
	to the user.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# library(chr/chr_op)
 | 
					 | 
				
			||||||
	Include file containing the operator declaractions
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# library(chr/chr_translate)
 | 
					 | 
				
			||||||
	Core translation module.  Defines chr_translate/2.	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# library(chr/chr_debug)
 | 
					 | 
				
			||||||
	Debugging routines, made available to the user through
 | 
					 | 
				
			||||||
	library(chr).  Very incomplete.
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	# library(chr/hprolog)
 | 
					 | 
				
			||||||
	Compatibility to hProlog.  Should be abstracted.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	# library(chr/pairlist)
 | 
					 | 
				
			||||||
	Deal with lists of Name-Value.  Used by chr_translate.pl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Status
 | 
					 | 
				
			||||||
======
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Work  in  progress.  The  compiler  source  (chr_translate.pl)  contains
 | 
					 | 
				
			||||||
various `todo' issues. The debugger is  almost non existent. Future work
 | 
					 | 
				
			||||||
should  improve  on   the   compatibility    with   the   reference  CHR
 | 
					 | 
				
			||||||
documentation. Details on loading CHR files are subject to change.
 | 
					 | 
				
			||||||
@@ -1,51 +0,0 @@
 | 
				
			|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
% Author:	Tom Schrijvers
 | 
					 | 
				
			||||||
% Email:	Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
% Copyright:	K.U.Leuven 2004
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
:- module(a_star,
 | 
					 | 
				
			||||||
	[
 | 
					 | 
				
			||||||
		a_star/4
 | 
					 | 
				
			||||||
	]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- use_module(binomialheap).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- use_module(find).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- use_module(hprolog).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
a_star(DataIn,FinalData,ExpandData,DataOut) :-
 | 
					 | 
				
			||||||
	a_star_node(DataIn,0,InitialNode),
 | 
					 | 
				
			||||||
	empty_q(NewQueue),
 | 
					 | 
				
			||||||
	insert_q(NewQueue,InitialNode,Queue),
 | 
					 | 
				
			||||||
	a_star_aux(Queue,FinalData,ExpandData,EndNode),
 | 
					 | 
				
			||||||
	a_star_node(DataOut,_,EndNode).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
a_star_aux(Queue,FinalData,ExpandData,EndNode) :-
 | 
					 | 
				
			||||||
	delete_min_q(Queue,Queue1,Node), 
 | 
					 | 
				
			||||||
	( final_node(FinalData,Node) ->
 | 
					 | 
				
			||||||
		Node = EndNode
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		expand_node(ExpandData,Node,Nodes),
 | 
					 | 
				
			||||||
		insert_list_q(Nodes,Queue1,NQueue),
 | 
					 | 
				
			||||||
		a_star_aux(NQueue,FinalData,ExpandData,EndNode)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
final_node(D^Call,Node) :-
 | 
					 | 
				
			||||||
	a_star_node(Data,_,Node),	
 | 
					 | 
				
			||||||
	term_variables(Call,Vars),
 | 
					 | 
				
			||||||
	chr_delete(Vars,D,DVars),
 | 
					 | 
				
			||||||
	copy_term(D^Call-DVars,Data^NCall-DVars),
 | 
					 | 
				
			||||||
	call(NCall).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
expand_node(D^Ds^C^Call,Node,Nodes) :-
 | 
					 | 
				
			||||||
	a_star_node(Data,Score,Node),
 | 
					 | 
				
			||||||
	term_variables(Call,Vars),
 | 
					 | 
				
			||||||
	chr_delete(Vars,D,DVars0),
 | 
					 | 
				
			||||||
	chr_delete(DVars0,Ds,DVars1),
 | 
					 | 
				
			||||||
	chr_delete(DVars1,C,DVars),
 | 
					 | 
				
			||||||
	copy_term(D^Ds^C^Call-DVars,Data^EData^Cost^NCall-DVars),
 | 
					 | 
				
			||||||
	term_variables(Node,NVars,DVars),	
 | 
					 | 
				
			||||||
	find_with_var_identity(ENode,NVars,(NCall,EScore is Cost + Score,a_star:a_star_node(EData,EScore,ENode)),Nodes).	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
a_star_node(Data,Score,Data-Score).
 | 
					 | 
				
			||||||
@@ -1,113 +0,0 @@
 | 
				
			|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
% Binomial Heap imlementation based on
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Functional Binomial Queues
 | 
					 | 
				
			||||||
%	James F. King
 | 
					 | 
				
			||||||
%	University of Glasgow
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
% Author:	Tom Schrijvers
 | 
					 | 
				
			||||||
% Email:	Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
% Copyright:	K.U.Leuven 2004
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- module(binomialheap,
 | 
					 | 
				
			||||||
	[
 | 
					 | 
				
			||||||
		empty_q/1,
 | 
					 | 
				
			||||||
		insert_q/3,
 | 
					 | 
				
			||||||
		insert_list_q/3,
 | 
					 | 
				
			||||||
		delete_min_q/3,
 | 
					 | 
				
			||||||
		find_min_q/2
 | 
					 | 
				
			||||||
	]).	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- use_module(library(lists),[reverse/2]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
% data Tree a = Node a [Tree a]
 | 
					 | 
				
			||||||
% type BinQueue a = [Maybe (Tree a)]
 | 
					 | 
				
			||||||
% data Maybe a = Zero | One a
 | 
					 | 
				
			||||||
% type Item = (Entry,Key)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
entry(Entry-_,Entry).
 | 
					 | 
				
			||||||
key(_-Key,Key).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
empty_q([]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
meld_q(P,Q,R) :-
 | 
					 | 
				
			||||||
	meld_qc(P,Q,zero,R).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
meld_qc([],Q,zero,Q) :- !.
 | 
					 | 
				
			||||||
meld_qc([],Q,C,R) :- !,
 | 
					 | 
				
			||||||
	meld_q(Q,[C],R).
 | 
					 | 
				
			||||||
meld_qc(P,[],C,R) :- !,
 | 
					 | 
				
			||||||
	meld_qc([],P,C,R).
 | 
					 | 
				
			||||||
meld_qc([zero|Ps],[zero|Qs],C,R) :- !,
 | 
					 | 
				
			||||||
	R = [C | Rs],
 | 
					 | 
				
			||||||
	meld_q(Ps,Qs,Rs).
 | 
					 | 
				
			||||||
meld_qc([one(node(X,Xs))|Ps],[one(node(Y,Ys))|Qs],C,R) :- !,
 | 
					 | 
				
			||||||
	key(X,KX),
 | 
					 | 
				
			||||||
	key(Y,KY),
 | 
					 | 
				
			||||||
	( KX < KY ->
 | 
					 | 
				
			||||||
		T = node(X,[node(Y,Ys)|Xs])
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		T = node(Y,[node(X,Xs)|Ys])
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	R = [C|Rs],
 | 
					 | 
				
			||||||
	meld_qc(Ps,Qs,one(T),Rs).
 | 
					 | 
				
			||||||
meld_qc([P|Ps],[Q|Qs],C,Rs) :-
 | 
					 | 
				
			||||||
	meld_qc([Q|Ps],[C|Qs],P,Rs).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
insert_q(Q,I,NQ) :-
 | 
					 | 
				
			||||||
	meld_q([one(node(I,[]))],Q,NQ).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
insert_list_q([],Q,Q).
 | 
					 | 
				
			||||||
insert_list_q([I|Is],Q,NQ) :-
 | 
					 | 
				
			||||||
	insert_q(Q,I,Q1),
 | 
					 | 
				
			||||||
	insert_list_q(Is,Q1,NQ).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
min_tree([T|Ts],MT) :-
 | 
					 | 
				
			||||||
	min_tree_acc(Ts,T,MT).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
min_tree_acc([],MT,MT).
 | 
					 | 
				
			||||||
min_tree_acc([T|Ts],Acc,MT) :-
 | 
					 | 
				
			||||||
	least(T,Acc,NAcc),
 | 
					 | 
				
			||||||
	min_tree_acc(Ts,NAcc,MT).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
least(zero,T,T) :- !.
 | 
					 | 
				
			||||||
least(T,zero,T) :- !.
 | 
					 | 
				
			||||||
least(one(node(X,Xs)),one(node(Y,Ys)),T) :-
 | 
					 | 
				
			||||||
	key(X,KX),
 | 
					 | 
				
			||||||
	key(Y,KY),
 | 
					 | 
				
			||||||
	( KX < KY ->
 | 
					 | 
				
			||||||
		T = one(node(X,Xs))
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		T = one(node(Y,Ys))
 | 
					 | 
				
			||||||
	).		
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
remove_tree([],_,[]).
 | 
					 | 
				
			||||||
remove_tree([T|Ts],I,[NT|NTs]) :-
 | 
					 | 
				
			||||||
	( T == zero ->
 | 
					 | 
				
			||||||
		NT = T
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		T = one(node(X,_)),
 | 
					 | 
				
			||||||
		( X == I ->
 | 
					 | 
				
			||||||
			NT = zero
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			NT = T
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	remove_tree(Ts,I,NTs).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
delete_min_q(Q,NQ,Min) :-
 | 
					 | 
				
			||||||
	min_tree(Q,one(node(Min,Ts))),
 | 
					 | 
				
			||||||
	remove_tree(Q,Min,Q1),
 | 
					 | 
				
			||||||
	reverse(Ts,RTs),
 | 
					 | 
				
			||||||
	make_ones(RTs,Q2),
 | 
					 | 
				
			||||||
	meld_q(Q2,Q1,NQ).	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
make_ones([],[]).
 | 
					 | 
				
			||||||
make_ones([N|Ns],[one(N)|RQ]) :-
 | 
					 | 
				
			||||||
	make_ones(Ns,RQ).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
find_min_q(Q,I) :-
 | 
					 | 
				
			||||||
	min_tree(Q,one(node(I,_))).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,599 +0,0 @@
 | 
				
			|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
% Author:	Tom Schrijvers
 | 
					 | 
				
			||||||
% Email:	Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
% Copyright:	K.U.Leuven 2004
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
:- module(builtins,
 | 
					 | 
				
			||||||
	[
 | 
					 | 
				
			||||||
		negate_b/2,
 | 
					 | 
				
			||||||
		entails_b/2,
 | 
					 | 
				
			||||||
		binds_b/2,
 | 
					 | 
				
			||||||
		builtin_binds_b/2
 | 
					 | 
				
			||||||
	]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- use_module(hprolog).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
negate_b(A,B) :- once(negate(A,B)).
 | 
					 | 
				
			||||||
negate((A,B),NotB) :- A==true,negate(B,NotB). % added by jon
 | 
					 | 
				
			||||||
negate((A,B),NotA) :- B==true,negate(A,NotA). % added by jon
 | 
					 | 
				
			||||||
negate((A,B),(NotA;NotB)) :- negate(A,NotA),negate(B,NotB). % added by jon
 | 
					 | 
				
			||||||
negate((A;B),(NotA,NotB)) :- negate(A,NotA),negate(B,NotB). % added by jon
 | 
					 | 
				
			||||||
negate(true,fail).
 | 
					 | 
				
			||||||
negate(fail,true).
 | 
					 | 
				
			||||||
negate(X =< Y, Y < X).
 | 
					 | 
				
			||||||
negate(X > Y, Y >= X).
 | 
					 | 
				
			||||||
negate(X >= Y, Y > X).
 | 
					 | 
				
			||||||
negate(X < Y, Y =< X).
 | 
					 | 
				
			||||||
negate(X == Y, X \== Y). % added by jon
 | 
					 | 
				
			||||||
negate(X \== Y, X == Y). % added by jon
 | 
					 | 
				
			||||||
negate(X =:= Y, X =\= Y). % added by jon
 | 
					 | 
				
			||||||
negate(X is Y, X =\= Y). % added by jon
 | 
					 | 
				
			||||||
negate(X =\= Y, X =:= Y). % added by jon
 | 
					 | 
				
			||||||
negate(X = Y, X \= Y). % added by jon
 | 
					 | 
				
			||||||
negate(X \= Y, X = Y). % added by jon
 | 
					 | 
				
			||||||
negate(var(X),nonvar(X)).
 | 
					 | 
				
			||||||
negate(nonvar(X),var(X)).
 | 
					 | 
				
			||||||
negate(\+ X,X). % added by jon
 | 
					 | 
				
			||||||
negate(X,\+ X). % added by jon
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
entails_b(fail,_) :-!.
 | 
					 | 
				
			||||||
entails_b(A,B) :-
 | 
					 | 
				
			||||||
	( var(B) ->
 | 
					 | 
				
			||||||
		entails(A,B,[A])
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		once((
 | 
					 | 
				
			||||||
			entails(A,C,[A]),
 | 
					 | 
				
			||||||
			B == C
 | 
					 | 
				
			||||||
		))
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
entails(A,A,_).
 | 
					 | 
				
			||||||
entails(A,C,History) :-
 | 
					 | 
				
			||||||
	entails_(A,B),
 | 
					 | 
				
			||||||
	\+ hprolog:memberchk_eq(B,History),
 | 
					 | 
				
			||||||
	entails(B,C,[B|History]).		
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
entails_(X > Y, X >= Y).
 | 
					 | 
				
			||||||
entails_(X > Y, Y < X).
 | 
					 | 
				
			||||||
entails_(X >= Y, Y =< X).
 | 
					 | 
				
			||||||
entails_(X =< Y, Y >= X). %added by jon
 | 
					 | 
				
			||||||
entails_(X < Y, Y > X).
 | 
					 | 
				
			||||||
entails_(X < Y, X =< Y).
 | 
					 | 
				
			||||||
entails_(X > Y, X \== Y).
 | 
					 | 
				
			||||||
entails_(X \== Y, Y \== X).
 | 
					 | 
				
			||||||
entails_(X == Y, Y == X).
 | 
					 | 
				
			||||||
entails_(X == Y, X =:= Y) :- ground(X). %added by jon
 | 
					 | 
				
			||||||
entails_(X == Y, X =:= Y) :- ground(Y). %added by jon
 | 
					 | 
				
			||||||
entails_(X \== Y, X =\= Y) :- ground(X). %added by jon
 | 
					 | 
				
			||||||
entails_(X \== Y, X =\= Y) :- ground(Y). %added by jon
 | 
					 | 
				
			||||||
entails_(X =:= Y, Y =:= X). %added by jon
 | 
					 | 
				
			||||||
entails_(X =\= Y, Y =\= X). %added by jon
 | 
					 | 
				
			||||||
entails_(X == Y, X >= Y). %added by jon
 | 
					 | 
				
			||||||
entails_(X == Y, X =< Y). %added by jon
 | 
					 | 
				
			||||||
entails_(ground(X),nonvar(X)).
 | 
					 | 
				
			||||||
entails_(compound(X),nonvar(X)).
 | 
					 | 
				
			||||||
entails_(atomic(X),nonvar(X)).
 | 
					 | 
				
			||||||
entails_(number(X),nonvar(X)).
 | 
					 | 
				
			||||||
entails_(atom(X),nonvar(X)).
 | 
					 | 
				
			||||||
entails_(fail,true).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
builtin_binds_b(G,Vars) :-
 | 
					 | 
				
			||||||
	builtin_binds_(G,L,[]),
 | 
					 | 
				
			||||||
	sort(L,Vars).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
builtin_binds_(var(_),L,L).
 | 
					 | 
				
			||||||
builtin_binds_(nonvar(_),L,L).
 | 
					 | 
				
			||||||
builtin_binds_(ground(_),L,L).
 | 
					 | 
				
			||||||
builtin_binds_(compound(_),L,L).
 | 
					 | 
				
			||||||
builtin_binds_(number(_),L,L).
 | 
					 | 
				
			||||||
builtin_binds_(atom(_),L,L).
 | 
					 | 
				
			||||||
builtin_binds_(atomic(_),L,L).
 | 
					 | 
				
			||||||
builtin_binds_(integer(_),L,L).
 | 
					 | 
				
			||||||
builtin_binds_(float(_),L,L).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
builtin_binds_(?=(_, _), L, L).
 | 
					 | 
				
			||||||
builtin_binds_(_<_, L, L).
 | 
					 | 
				
			||||||
builtin_binds_(_=:=_, L, L).
 | 
					 | 
				
			||||||
builtin_binds_(_=<_, L, L).
 | 
					 | 
				
			||||||
builtin_binds_(_==_, L, L).
 | 
					 | 
				
			||||||
builtin_binds_(_=@=_, L, L).
 | 
					 | 
				
			||||||
builtin_binds_(_=\=_, L, L).
 | 
					 | 
				
			||||||
builtin_binds_(_>=_, L, L).
 | 
					 | 
				
			||||||
builtin_binds_(_>_, L, L).
 | 
					 | 
				
			||||||
builtin_binds_(_@<_, L, L).
 | 
					 | 
				
			||||||
builtin_binds_(_@=<_, L, L).
 | 
					 | 
				
			||||||
builtin_binds_(_@>=_, L, L).
 | 
					 | 
				
			||||||
builtin_binds_(_@>_, L, L).
 | 
					 | 
				
			||||||
builtin_binds_(_\==_, L, L).
 | 
					 | 
				
			||||||
builtin_binds_(_\=@=_, L, L).
 | 
					 | 
				
			||||||
builtin_binds_(true,L,L).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
% TODO: check all these SWI-Prolog built-ins for binding behavior.
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
% builtin_binds_(format(_,_),L,L).
 | 
					 | 
				
			||||||
% builtin_binds_(portray(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(write(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(write(_),L,L).
 | 
					 | 
				
			||||||
% builtin_binds_(write(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(write_canonical(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(write_canonical(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(write_term(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(write_term(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(writef(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(writef(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(writeln(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(writeln(_),L,L).
 | 
					 | 
				
			||||||
% builtin_binds_(writeq(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(writeq(_, _), L, L).
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
% builtin_binds_(!(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(!, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_((_'|'_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_((_*->_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(abolish(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(abolish(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(abort, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(absolute_file_name(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(absolute_file_name(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(access_file(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(acyclic_term(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(add_import_module(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(append(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(apply(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(arg(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(arithmetic_function(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(assert(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(assert(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(asserta(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(asserta(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(assertz(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(assertz(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(at_end_of_stream(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(at_end_of_stream, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(at_halt(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(at_initialization(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(atom(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(atom_chars(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(atom_codes(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(atom_concat(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(atom_length(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(atom_number(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(atom_prefix(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(atom_to_term(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(atomic(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(attvar(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(autoload(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(autoload, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(b_getval(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(b_setval(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(bagof(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(between(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(block(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(break, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(byte_count(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call(_, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call(_, _, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call(_, _, _, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call(_, _, _, _, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call(_, _, _, _, _, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call(_, _, _, _, _, _, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call(_, _, _, _, _, _, _, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call(_, _, _, _, _, _, _, _, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call_cleanup(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call_cleanup(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call_shared_object_function(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(call_with_depth_limit(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(callable(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(catch(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(char_code(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(char_conversion(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(char_type(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(character_count(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(clause(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(clause(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(clause_property(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(close(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(close(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(close_shared_object(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(code_type(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(collation_key(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(compare(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(compile_aux_clauses(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(compile_predicates(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(compiling, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(compound(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(concat_atom(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(concat_atom(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(consult(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(context_module(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(copy_stream_data(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(copy_stream_data(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(copy_term(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(copy_term_nat(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_arithmetic_function(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_atom(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_blob(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_char_conversion(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_flag(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_format_predicate(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_functor(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_input(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_key(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_module(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_module(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_op(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_output(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_predicate(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_predicate(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_prolog_flag(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_resource(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(current_signal(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(cyclic_term(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(date_time_stamp(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(debugging, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(default_module(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(del_attr(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(delete_directory(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(delete_file(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(delete_import_module(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(deterministic(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(downcase_atom(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(duplicate_term(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(dwim_match(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(dwim_match(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(dwim_predicate(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(ensure_loaded(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(erase(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(eval_license, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(exists_directory(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(exists_file(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(exit(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(expand_file_name(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(expand_file_search_path(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(expand_goal(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(expand_term(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(export(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(export_list(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(fail(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(fail, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(file_base_name(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(file_directory_name(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(file_name_extension(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(fileerrors(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(findall(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(findall(_, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(flag(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(float(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(flush_output(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(flush_output, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(forall(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(format(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(format(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(format(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(format_predicate(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(format_time(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(format_time(_, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(freeze(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(frozen(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(functor(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(garbage_collect, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(garbage_collect_atoms, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(garbage_collect_clauses, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(get(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(get(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(get0(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(get0(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(get_attr(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(get_attrs(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(get_byte(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(get_byte(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(get_char(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(get_char(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(get_code(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(get_code(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(get_single_char(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(get_time(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(getenv(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(ground(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(halt(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(halt, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(hash(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(hash_term(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(ignore(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(import(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(import_module(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(index(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(integer(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(is_absolute_file_name(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(is_list(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(is_stream(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(keysort(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(leash(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(length(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(license(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(license(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(line_count(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(line_position(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(load_files(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(load_files(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(make_directory(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(make_library_index(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(make_library_index(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(maplist(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(maplist(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(maplist(_, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(memberchk(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(message_queue_create(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(message_queue_create(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(message_queue_destroy(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(message_queue_property(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(message_to_string(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(module(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(msort(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(mutex_create(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(mutex_create(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(mutex_destroy(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(mutex_lock(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(mutex_property(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(mutex_statistics, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(mutex_trylock(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(mutex_unlock(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(mutex_unlock_all, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(name(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(nb_current(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(nb_delete(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(nb_getval(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(nb_linkarg(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(nb_linkval(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(nb_setarg(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(nb_setval(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(nl(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(nl, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(nonvar(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(noprofile(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(noprotocol, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(nospy(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(nospyall, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(not(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(notrace(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(notrace, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(nth_clause(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(number(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(number_chars(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(number_codes(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(numbervars(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(numbervars(_, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(on_signal(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(once(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(op(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(open(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(open(_, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(open_null_stream(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(open_resource(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(open_resource(_, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(open_shared_object(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(open_shared_object(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(open_xterm(_, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(peek_byte(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(peek_byte(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(peek_char(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(peek_char(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(peek_code(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(peek_code(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(phrase(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(phrase(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(plus(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(predicate_property(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(preprocessor(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(print(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(print(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(print_message(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(print_message_lines(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(profiler(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(prolog, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(prolog_choice_attribute(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(prolog_current_frame(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(prolog_frame_attribute(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(prolog_load_context(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(prolog_skip_level(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(prolog_to_os_filename(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(prompt(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(prompt1(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(protocol(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(protocola(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(protocolling(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(put(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(put(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(put_attr(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(put_attrs(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(put_byte(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(put_byte(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(put_char(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(put_char(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(put_code(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(put_code(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(qcompile(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(rational(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(rational(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(read(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(read(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(read_clause(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(read_clause(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(read_history(_, _, _, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(read_link(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(read_pending_input(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(read_term(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(read_term(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(recorda(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(recorda(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(recorded(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(recorded(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(recordz(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(recordz(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(redefine_system_predicate(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(reload_library_index, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(rename_file(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(repeat, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(require(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(reset_profiler, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(retract(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(retractall(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(same_file(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(same_term(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(see(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(seeing(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(seek(_, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(seen, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(set_input(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(set_output(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(set_prolog_IO(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(set_prolog_flag(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(set_stream(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(set_stream_position(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(setarg(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(setenv(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(setlocale(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(setof(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(setup_and_call_cleanup(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(setup_and_call_cleanup(_, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(shell(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(shell(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(shell, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(size_file(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(skip(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(skip(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(sleep(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(sort(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(source_file(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(source_file(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(source_location(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(spy(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(stamp_date_time(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(statistics(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(statistics, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(stream_position_data(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(stream_property(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(string(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(string_concat(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(string_length(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(string_to_atom(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(string_to_list(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(strip_module(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(style_check(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(sub_atom(_, _, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(sub_string(_, _, _, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(succ(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(swritef(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(swritef(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(tab(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(tab(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(tell(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(telling(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(term_to_atom(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(term_variables(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(term_variables(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_at_exit(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_create(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_detach(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_exit(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_get_message(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_get_message(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_join(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_kill(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_peek_message(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_peek_message(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_property(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_self(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_send_message(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_setconcurrency(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_signal(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(thread_statistics(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(throw(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(time_file(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(tmp_file(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(told, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(trim_stacks, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(tty_get_capability(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(tty_goto(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(tty_put(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(tty_size(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(ttyflush, L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(unifiable(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(unify_with_occurs_check(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(unsetenv(_), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(upcase_atom(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(wait_for_input(_, _, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(wildcard_match(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(with_mutex(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(with_output_to(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(working_directory(_, _), L, L).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
% builtin_binds_(functor(Term, Functor, Arity), [Term,Functor,Arity|T], T).
 | 
					 | 
				
			||||||
% builtin_binds_(arg(Arg, Term, Pos), [Arg,Term,Pos|T], T).
 | 
					 | 
				
			||||||
% builtin_binds_(term_variables(_, _), L, L).
 | 
					 | 
				
			||||||
% builtin_binds_(X=Y, [X,Y|T], T).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
builtin_binds_(X is _,[X|L],L).
 | 
					 | 
				
			||||||
builtin_binds_((G1,G2),L,T) :-
 | 
					 | 
				
			||||||
	builtin_binds_(G1,L,R),
 | 
					 | 
				
			||||||
	builtin_binds_(G2,R,T).
 | 
					 | 
				
			||||||
builtin_binds_((G1;G2),L,T) :-
 | 
					 | 
				
			||||||
	builtin_binds_(G1,L,R),
 | 
					 | 
				
			||||||
	builtin_binds_(G2,R,T).
 | 
					 | 
				
			||||||
builtin_binds_((G1->G2),L,T) :-
 | 
					 | 
				
			||||||
	builtin_binds_(G1,L,R),
 | 
					 | 
				
			||||||
	builtin_binds_(G2,R,T).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
builtin_binds_(\+ G,L,T) :-
 | 
					 | 
				
			||||||
	builtin_binds_(G,L,T).
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
binds_b(G,Vars) :-
 | 
					 | 
				
			||||||
	binds_(G,L,[]),
 | 
					 | 
				
			||||||
	sort(L,Vars).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
binds_(var(_),L,L).
 | 
					 | 
				
			||||||
binds_(nonvar(_),L,L).
 | 
					 | 
				
			||||||
binds_(ground(_),L,L).
 | 
					 | 
				
			||||||
binds_(compound(_),L,L).
 | 
					 | 
				
			||||||
binds_(number(_),L,L).
 | 
					 | 
				
			||||||
binds_(atom(_),L,L).
 | 
					 | 
				
			||||||
binds_(atomic(_),L,L).
 | 
					 | 
				
			||||||
binds_(integer(_),L,L).
 | 
					 | 
				
			||||||
binds_(float(_),L,L).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
binds_(_ > _ ,L,L).
 | 
					 | 
				
			||||||
binds_(_ < _ ,L,L).
 | 
					 | 
				
			||||||
binds_(_ =< _,L,L).
 | 
					 | 
				
			||||||
binds_(_ >= _,L,L).
 | 
					 | 
				
			||||||
binds_(_ =:= _,L,L).
 | 
					 | 
				
			||||||
binds_(_ =\= _,L,L).
 | 
					 | 
				
			||||||
binds_(_ == _,L,L).
 | 
					 | 
				
			||||||
binds_(_ \== _,L,L).
 | 
					 | 
				
			||||||
binds_(true,L,L).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
binds_(write(_),L,L).
 | 
					 | 
				
			||||||
binds_(writeln(_),L,L).
 | 
					 | 
				
			||||||
binds_(format(_,_),L,L).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
binds_(X is _,[X|L],L).
 | 
					 | 
				
			||||||
binds_((G1,G2),L,T) :-
 | 
					 | 
				
			||||||
	binds_(G1,L,R),
 | 
					 | 
				
			||||||
	binds_(G2,R,T).
 | 
					 | 
				
			||||||
binds_((G1;G2),L,T) :-
 | 
					 | 
				
			||||||
	binds_(G1,L,R),
 | 
					 | 
				
			||||||
	binds_(G2,R,T).
 | 
					 | 
				
			||||||
binds_((G1->G2),L,T) :-
 | 
					 | 
				
			||||||
	binds_(G1,L,R),
 | 
					 | 
				
			||||||
	binds_(G2,R,T).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
binds_(\+ G,L,T) :-
 | 
					 | 
				
			||||||
	binds_(G,L,T).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
binds_(G,L,T) :- term_variables(G,GVars),append(GVars,T,L).	%jon
 | 
					 | 
				
			||||||
@@ -1,5 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
:- include('chr.pl').
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,173 +0,0 @@
 | 
				
			|||||||
/*  $Id: chr_compiler_errors.pl,v 1.3 2008-03-13 14:37:59 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Author:        Tom Schrijvers
 | 
					 | 
				
			||||||
    E-mail:        Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2005, K.U. Leuven
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
:- module(chr_compiler_errors,
 | 
					 | 
				
			||||||
		[	
 | 
					 | 
				
			||||||
			chr_info/3,
 | 
					 | 
				
			||||||
			chr_warning/3,
 | 
					 | 
				
			||||||
			chr_error/3,
 | 
					 | 
				
			||||||
			print_chr_error/1
 | 
					 | 
				
			||||||
		]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- use_module(chr_compiler_options).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
% chr_info(+Type,+FormattedMessage,+MessageParameters)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_info(_,Message,Params) :-
 | 
					 | 
				
			||||||
	( \+verbosity_on ->
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		long_line_with_equality_signs,
 | 
					 | 
				
			||||||
		format(user_error,'CHR compiler:\n',[]),	
 | 
					 | 
				
			||||||
		format(user_error,Message,Params),
 | 
					 | 
				
			||||||
		long_line_with_equality_signs
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
verbosity_on :- 
 | 
					 | 
				
			||||||
	current_prolog_flag(verbose,V), V \== silent, 	
 | 
					 | 
				
			||||||
	current_prolog_flag(verbose_load,true).
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SICStus begin
 | 
					 | 
				
			||||||
%% verbosity_on.  % at the moment
 | 
					 | 
				
			||||||
%% SICStus end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
% chr_warning(+Type,+FormattedMessage,+MessageParameters)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_warning(deprecated(Term),Message,Params) :- !,
 | 
					 | 
				
			||||||
	long_line_with_equality_signs,
 | 
					 | 
				
			||||||
	format(user_error,'CHR compiler WARNING: deprecated syntax      ~w.\n',[Term]),	
 | 
					 | 
				
			||||||
	format(user_error,'    `--> ',[]),
 | 
					 | 
				
			||||||
	format(user_error,Message,Params),
 | 
					 | 
				
			||||||
        format(user_error,'    Support for deprecated syntax will be discontinued in the near future!\n',[]),
 | 
					 | 
				
			||||||
	long_line_with_equality_signs.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_warning(internal,Message,Params) :- !,
 | 
					 | 
				
			||||||
	long_line_with_equality_signs,
 | 
					 | 
				
			||||||
	format(user_error,'CHR compiler WARNING: something unexpected happened in the CHR compiler.\n',[]),	
 | 
					 | 
				
			||||||
	format(user_error,'    `--> ',[]),
 | 
					 | 
				
			||||||
	format(user_error,Message,Params),
 | 
					 | 
				
			||||||
        format(user_error,'    Your program may not have been compiled correctly!\n',[]),
 | 
					 | 
				
			||||||
        format(user_error,'    Please contact tom.schrijvers@cs.kuleuven.be.\n',[]),
 | 
					 | 
				
			||||||
	long_line_with_equality_signs.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_warning(unsupported_pragma(Pragma,Rule),Message,Params) :- !,
 | 
					 | 
				
			||||||
	long_line_with_equality_signs,
 | 
					 | 
				
			||||||
	format(user_error,'CHR compiler WARNING: unsupported pragma ~w in ~@.\n',[Pragma,format_rule(Rule)]),	
 | 
					 | 
				
			||||||
	format(user_error,'    `--> ',[]),
 | 
					 | 
				
			||||||
	format(user_error,Message,Params),
 | 
					 | 
				
			||||||
        format(user_error,'    Pragma is ignored!\n',[]),
 | 
					 | 
				
			||||||
	long_line_with_equality_signs.
 | 
					 | 
				
			||||||
chr_warning(problem_pragma(Pragma,Rule),Message,Params) :- !,
 | 
					 | 
				
			||||||
	long_line_with_equality_signs,
 | 
					 | 
				
			||||||
	format(user_error,'CHR compiler WARNING: unsupported pragma ~w in ~@.\n',[Pragma,format_rule(Rule)]),	
 | 
					 | 
				
			||||||
	format(user_error,'    `--> ',[]),
 | 
					 | 
				
			||||||
	format(user_error,Message,Params),
 | 
					 | 
				
			||||||
	long_line_with_equality_signs.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_warning(_,Message,Params) :-
 | 
					 | 
				
			||||||
	( chr_pp_flag(verbosity,on) ->
 | 
					 | 
				
			||||||
		long_line_with_equality_signs,
 | 
					 | 
				
			||||||
		format(user_error,'CHR compiler WARNING:\n',[]),	
 | 
					 | 
				
			||||||
		format(user_error,'    `--> ',[]),
 | 
					 | 
				
			||||||
		format(user_error,Message,Params),
 | 
					 | 
				
			||||||
		long_line_with_equality_signs
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
% chr_error(+Type,+FormattedMessage,+MessageParameters)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_error(Type,Message,Params) :-
 | 
					 | 
				
			||||||
	throw(chr_error(error(Type,Message,Params))).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
print_chr_error(error(Type,Message,Params)) :-
 | 
					 | 
				
			||||||
	print_chr_error(Type,Message,Params).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
print_chr_error(syntax(Term),Message,Params) :- !,
 | 
					 | 
				
			||||||
	long_line_with_equality_signs,
 | 
					 | 
				
			||||||
	format(user_error,'CHR compiler ERROR: invalid syntax "~w".\n',[Term]),	
 | 
					 | 
				
			||||||
	format(user_error,'    `--> ',[]),
 | 
					 | 
				
			||||||
	format(user_error,Message,Params),
 | 
					 | 
				
			||||||
	long_line_with_equality_signs.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
print_chr_error(type_error,Message,Params) :- !,
 | 
					 | 
				
			||||||
	long_line_with_equality_signs,
 | 
					 | 
				
			||||||
	format(user_error,'CHR compiler TYPE ERROR:\n',[]),	
 | 
					 | 
				
			||||||
	format(user_error,'    `--> ',[]),
 | 
					 | 
				
			||||||
	format(user_error,Message,Params),
 | 
					 | 
				
			||||||
	long_line_with_equality_signs.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
print_chr_error(internal,Message,Params) :- !,
 | 
					 | 
				
			||||||
	long_line_with_equality_signs,
 | 
					 | 
				
			||||||
	format(user_error,'CHR compiler ERROR: something unexpected happened in the CHR compiler.\n',[]),	
 | 
					 | 
				
			||||||
	format(user_error,'    `--> ',[]),
 | 
					 | 
				
			||||||
	format(user_error,Message,Params),
 | 
					 | 
				
			||||||
        format(user_error,'    Please contact tom.schrijvers@cs.kuleuven.be.\n',[]),
 | 
					 | 
				
			||||||
	long_line_with_equality_signs.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
print_chr_error(cyclic_alias(Alias),_Message,_Params) :- !,
 | 
					 | 
				
			||||||
	long_line_with_equality_signs,
 | 
					 | 
				
			||||||
	format(user_error,'CHR compiler ERROR: cyclic alias "~w".\n',[Alias]),	
 | 
					 | 
				
			||||||
	format(user_error,'    `--> Aborting compilation.\n',[]),
 | 
					 | 
				
			||||||
	long_line_with_equality_signs.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
print_chr_error(_,Message,Params) :-
 | 
					 | 
				
			||||||
	long_line_with_equality_signs,
 | 
					 | 
				
			||||||
	format(user_error,'CHR compiler ERROR:\n',[]),	
 | 
					 | 
				
			||||||
	format(user_error,'    `--> ',[]),
 | 
					 | 
				
			||||||
	format(user_error,Message,Params),
 | 
					 | 
				
			||||||
	long_line_with_equality_signs.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
format_rule(PragmaRule) :-
 | 
					 | 
				
			||||||
	PragmaRule = pragma(_,_,Pragmas,MaybeName,N),
 | 
					 | 
				
			||||||
	( MaybeName = yes(Name) ->
 | 
					 | 
				
			||||||
		write('rule '), write(Name)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		write('rule number '), write(N)
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	( memberchk(line_number(LineNumber),Pragmas) ->
 | 
					 | 
				
			||||||
		write(' (line '),
 | 
					 | 
				
			||||||
		write(LineNumber),
 | 
					 | 
				
			||||||
		write(')')
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
long_line_with_equality_signs :-
 | 
					 | 
				
			||||||
	format(user_error,'================================================================================\n',[]).
 | 
					 | 
				
			||||||
@@ -1,372 +0,0 @@
 | 
				
			|||||||
/*  $Id: chr_compiler_options.pl,v 1.4 2008-03-13 22:37:07 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Author:        Tom Schrijvers
 | 
					 | 
				
			||||||
    E-mail:        Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2005-2006, K.U. Leuven
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
:- module(chr_compiler_options,
 | 
					 | 
				
			||||||
	[ handle_option/2
 | 
					 | 
				
			||||||
	, init_chr_pp_flags/0
 | 
					 | 
				
			||||||
	, chr_pp_flag/2
 | 
					 | 
				
			||||||
	]).
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
%% SICStus begin
 | 
					 | 
				
			||||||
%% :- use_module(hprolog, [nb_setval/2,nb_getval/2]).
 | 
					 | 
				
			||||||
%% local_current_prolog_flag(_,_) :- fail.
 | 
					 | 
				
			||||||
%% SICStus end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
local_current_prolog_flag(X,Y) :- current_prolog_flag(X,Y).
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- use_module(chr_compiler_errors).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
% Global Options
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
handle_option(Name,Value) :- 
 | 
					 | 
				
			||||||
	var(Name), !,
 | 
					 | 
				
			||||||
	chr_error(syntax((:- chr_option(Name,Value))),'First argument should be an atom, not a variable.\n',[]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
handle_option(Name,Value) :- 
 | 
					 | 
				
			||||||
	var(Value), !,
 | 
					 | 
				
			||||||
	chr_error(syntax((:- chr_option(Name,Value))),'Second argument cannot be a variable.\n',[]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
handle_option(Name,Value) :-
 | 
					 | 
				
			||||||
	option_definition(Name,Value,Flags),
 | 
					 | 
				
			||||||
	!,
 | 
					 | 
				
			||||||
	set_chr_pp_flags(Flags).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
handle_option(Name,Value) :- 
 | 
					 | 
				
			||||||
	\+ option_definition(Name,_,_), !,
 | 
					 | 
				
			||||||
	chr_error(syntax((:- chr_option(Name,Value))),'Invalid option name ~w: consult the manual for valid options.\n',[Name]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
handle_option(Name,Value) :- 
 | 
					 | 
				
			||||||
	chr_error(syntax((:- chr_option(Name,Value))),'Invalid option value ~w: consult the manual for valid option values.\n',[Value]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(optimize,experimental,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ functional_dependency_analysis  - on,
 | 
					 | 
				
			||||||
                  check_unnecessary_active - full,
 | 
					 | 
				
			||||||
		  reorder_heads		   - on,
 | 
					 | 
				
			||||||
		  set_semantics_rule	   - on,
 | 
					 | 
				
			||||||
		  storage_analysis	   - on,
 | 
					 | 
				
			||||||
		  guard_via_reschedule     - on,
 | 
					 | 
				
			||||||
		  guard_simplification	   - on,
 | 
					 | 
				
			||||||
		  check_impossible_rules   - on,
 | 
					 | 
				
			||||||
		  occurrence_subsumption   - on,
 | 
					 | 
				
			||||||
		  observation_analysis	   - on,
 | 
					 | 
				
			||||||
		  ai_observation_analysis  - on,
 | 
					 | 
				
			||||||
		  late_allocation	   - on,
 | 
					 | 
				
			||||||
		  reduced_indexing	   - on,
 | 
					 | 
				
			||||||
		  term_indexing		   - on,
 | 
					 | 
				
			||||||
                  inline_insertremove      - on,
 | 
					 | 
				
			||||||
		  mixed_stores		   - on
 | 
					 | 
				
			||||||
		].
 | 
					 | 
				
			||||||
option_definition(optimize,full,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ functional_dependency_analysis  - on,
 | 
					 | 
				
			||||||
                  check_unnecessary_active - full,
 | 
					 | 
				
			||||||
		  reorder_heads		   - on,
 | 
					 | 
				
			||||||
		  set_semantics_rule	   - on,
 | 
					 | 
				
			||||||
		  storage_analysis	   - on,
 | 
					 | 
				
			||||||
		  guard_via_reschedule     - on,
 | 
					 | 
				
			||||||
		  guard_simplification	   - on,
 | 
					 | 
				
			||||||
		  check_impossible_rules   - on,
 | 
					 | 
				
			||||||
		  occurrence_subsumption   - on,
 | 
					 | 
				
			||||||
		  observation_analysis	   - on,
 | 
					 | 
				
			||||||
		  ai_observation_analysis  - on,
 | 
					 | 
				
			||||||
		  late_allocation	   - on,
 | 
					 | 
				
			||||||
		  reduced_indexing	   - on,
 | 
					 | 
				
			||||||
                  inline_insertremove      - on,
 | 
					 | 
				
			||||||
		  mixed_stores		   - off
 | 
					 | 
				
			||||||
		].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(optimize,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ functional_dependency_analysis  - off,
 | 
					 | 
				
			||||||
                  check_unnecessary_active - off,
 | 
					 | 
				
			||||||
		  reorder_heads		   - off,
 | 
					 | 
				
			||||||
		  set_semantics_rule	   - off,
 | 
					 | 
				
			||||||
		  storage_analysis	   - off,
 | 
					 | 
				
			||||||
		  guard_via_reschedule     - off,
 | 
					 | 
				
			||||||
		  guard_simplification	   - off,
 | 
					 | 
				
			||||||
		  check_impossible_rules   - off,
 | 
					 | 
				
			||||||
		  occurrence_subsumption   - off,
 | 
					 | 
				
			||||||
		  observation_analysis     - off,
 | 
					 | 
				
			||||||
		  ai_observation_analysis  - off,
 | 
					 | 
				
			||||||
		  late_allocation	   - off,
 | 
					 | 
				
			||||||
		  reduced_indexing	   - off
 | 
					 | 
				
			||||||
		].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(functional_dependency_analysis,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ functional_dependency_analysis - on ].
 | 
					 | 
				
			||||||
option_definition(functional_dependency_analysis,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ functional_dependency_analysis - off ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(set_semantics_rule,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ set_semantics_rule - on ].
 | 
					 | 
				
			||||||
option_definition(set_semantics_rule,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ set_semantics_rule - off ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(check_unnecessary_active,full,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ check_unnecessary_active - full ].
 | 
					 | 
				
			||||||
option_definition(check_unnecessary_active,simplification,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ check_unnecessary_active - simplification ].
 | 
					 | 
				
			||||||
option_definition(check_unnecessary_active,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ check_unnecessary_active - off ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(check_guard_bindings,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ guard_locks - on ].
 | 
					 | 
				
			||||||
option_definition(check_guard_bindings,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ guard_locks - off ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(reduced_indexing,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ reduced_indexing - on ].
 | 
					 | 
				
			||||||
option_definition(reduced_indexing,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ reduced_indexing - off ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(storage_analysis,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ storage_analysis - on ].
 | 
					 | 
				
			||||||
option_definition(storage_analysis,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ storage_analysis - off ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(guard_simplification,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ guard_simplification - on ].
 | 
					 | 
				
			||||||
option_definition(guard_simplification,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ guard_simplification - off ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(check_impossible_rules,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ check_impossible_rules - on ].
 | 
					 | 
				
			||||||
option_definition(check_impossible_rules,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ check_impossible_rules - off ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(occurrence_subsumption,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ occurrence_subsumption - on ].
 | 
					 | 
				
			||||||
option_definition(occurrence_subsumption,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ occurrence_subsumption - off ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(late_allocation,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ late_allocation - on ].
 | 
					 | 
				
			||||||
option_definition(late_allocation,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ late_allocation - off ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(inline_insertremove,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ inline_insertremove - on ].
 | 
					 | 
				
			||||||
option_definition(inline_insertremove,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ inline_insertremove - off ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(type_definition,TypeDef,[]) :-
 | 
					 | 
				
			||||||
	( nonvar(TypeDef) ->
 | 
					 | 
				
			||||||
	TypeDef = type(T,D),
 | 
					 | 
				
			||||||
	chr_translate:type_definition(T,D)
 | 
					 | 
				
			||||||
	; true).
 | 
					 | 
				
			||||||
option_definition(type_declaration,TypeDecl,[]) :-
 | 
					 | 
				
			||||||
	( nonvar(TypeDecl) ->
 | 
					 | 
				
			||||||
	functor(TypeDecl,F,A),
 | 
					 | 
				
			||||||
	TypeDecl =.. [_|ArgTypes],
 | 
					 | 
				
			||||||
	chr_translate:constraint_type(F/A,ArgTypes)
 | 
					 | 
				
			||||||
	; true).
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
option_definition(mode,ModeDecl,[]) :-
 | 
					 | 
				
			||||||
	( nonvar(ModeDecl) ->
 | 
					 | 
				
			||||||
	functor(ModeDecl,F,A),
 | 
					 | 
				
			||||||
	ModeDecl =.. [_|ArgModes],
 | 
					 | 
				
			||||||
	chr_translate:constraint_mode(F/A,ArgModes)
 | 
					 | 
				
			||||||
	; true).
 | 
					 | 
				
			||||||
option_definition(store,FA-Store,[]) :-
 | 
					 | 
				
			||||||
	chr_translate:store_type(FA,Store).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%------------------------------------------------------------------------------%
 | 
					 | 
				
			||||||
option_definition(declare_stored_constraints,off,[declare_stored_constraints-off]).
 | 
					 | 
				
			||||||
option_definition(declare_stored_constraints,on ,[declare_stored_constraints-on]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(stored,F/A,[]) :-
 | 
					 | 
				
			||||||
	chr_translate:stored_assertion(F/A).
 | 
					 | 
				
			||||||
%------------------------------------------------------------------------------%
 | 
					 | 
				
			||||||
option_definition(experiment,off,[experiment-off]).
 | 
					 | 
				
			||||||
option_definition(experiment,on,[experiment-on]).
 | 
					 | 
				
			||||||
option_definition(experimental,off,[experiment-off]).
 | 
					 | 
				
			||||||
option_definition(experimental,on,[experiment-on]).
 | 
					 | 
				
			||||||
%------------------------------------------------------------------------------%
 | 
					 | 
				
			||||||
option_definition(debug,off,Flags) :-
 | 
					 | 
				
			||||||
        option_definition(optimize,full,Flags2),
 | 
					 | 
				
			||||||
        Flags = [ debugable - off | Flags2].
 | 
					 | 
				
			||||||
option_definition(debug,on,Flags) :-
 | 
					 | 
				
			||||||
	( local_current_prolog_flag(generate_debug_info,false) ->
 | 
					 | 
				
			||||||
		% TODO: should not be allowed when nodebug flag is set in SWI-Prolog
 | 
					 | 
				
			||||||
		chr_warning(any,':- chr_option(debug,on) inconsistent with current_prolog_flag(generate_debug_info,off\n\tCHR option is ignored!\n)',[]),
 | 
					 | 
				
			||||||
		Flags = []
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
       		Flags = [ debugable - on ]
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(store_counter,off,[]).
 | 
					 | 
				
			||||||
option_definition(store_counter,on,[store_counter-on]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(observation,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [
 | 
					 | 
				
			||||||
			observation_analysis - off,
 | 
					 | 
				
			||||||
			ai_observation_analysis - off,
 | 
					 | 
				
			||||||
			late_allocation - off,
 | 
					 | 
				
			||||||
			storage_analysis - off
 | 
					 | 
				
			||||||
		].
 | 
					 | 
				
			||||||
option_definition(observation,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [
 | 
					 | 
				
			||||||
			observation_analysis - on,
 | 
					 | 
				
			||||||
			ai_observation_analysis - on
 | 
					 | 
				
			||||||
		].
 | 
					 | 
				
			||||||
option_definition(observation,regular,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [
 | 
					 | 
				
			||||||
			observation_analysis - on,
 | 
					 | 
				
			||||||
			ai_observation_analysis - off
 | 
					 | 
				
			||||||
		].
 | 
					 | 
				
			||||||
option_definition(observation,ai,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [
 | 
					 | 
				
			||||||
			observation_analysis - off,
 | 
					 | 
				
			||||||
			ai_observation_analysis - on
 | 
					 | 
				
			||||||
		].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(store_in_guards, on, [store_in_guards - on]).
 | 
					 | 
				
			||||||
option_definition(store_in_guards, off, [store_in_guards - off]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(solver_events,NMod,Flags) :-
 | 
					 | 
				
			||||||
	Flags =	[solver_events - NMod].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(toplevel_show_store,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [toplevel_show_store - on].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(toplevel_show_store,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [toplevel_show_store - off].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(term_indexing,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [term_indexing - on].
 | 
					 | 
				
			||||||
option_definition(term_indexing,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [term_indexing - off].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(verbosity,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [verbosity - on].
 | 
					 | 
				
			||||||
option_definition(verbosity,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [verbosity - off].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(ht_removal,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ht_removal - on].
 | 
					 | 
				
			||||||
option_definition(ht_removal,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [ht_removal - off].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(mixed_stores,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [mixed_stores - on].
 | 
					 | 
				
			||||||
option_definition(mixed_stores,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [mixed_stores - off].	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(line_numbers,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [line_numbers - on].
 | 
					 | 
				
			||||||
option_definition(line_numbers,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [line_numbers - off].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(dynattr,on,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [dynattr - on].
 | 
					 | 
				
			||||||
option_definition(dynattr,off,Flags) :-
 | 
					 | 
				
			||||||
	Flags = [dynattr - off].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(verbose,off,[verbose-off]).
 | 
					 | 
				
			||||||
option_definition(verbose,on,[verbose-on]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
option_definition(dump,off,[dump-off]).
 | 
					 | 
				
			||||||
option_definition(dump,on,[dump-on]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
init_chr_pp_flags :-
 | 
					 | 
				
			||||||
	chr_pp_flag_definition(Name,[DefaultValue|_]),
 | 
					 | 
				
			||||||
	set_chr_pp_flag(Name,DefaultValue),
 | 
					 | 
				
			||||||
	fail.
 | 
					 | 
				
			||||||
init_chr_pp_flags.		
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set_chr_pp_flags([]).
 | 
					 | 
				
			||||||
set_chr_pp_flags([Name-Value|Flags]) :-
 | 
					 | 
				
			||||||
	set_chr_pp_flag(Name,Value),
 | 
					 | 
				
			||||||
	set_chr_pp_flags(Flags).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set_chr_pp_flag(Name,Value) :-
 | 
					 | 
				
			||||||
	atom_concat('$chr_pp_',Name,GlobalVar),
 | 
					 | 
				
			||||||
	nb_setval(GlobalVar,Value).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_pp_flag_definition(functional_dependency_analysis,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(check_unnecessary_active,[off,full,simplification]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(reorder_heads,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(set_semantics_rule,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(guard_via_reschedule,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(guard_locks,[on,off]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(storage_analysis,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(debugable,[on,off]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(reduced_indexing,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(observation_analysis,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(ai_observation_analysis,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(store_in_guards,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(late_allocation,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(store_counter,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(guard_simplification,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(check_impossible_rules,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(occurrence_subsumption,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(observation,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(show,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(inline_insertremove,[on,off]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(solver_events,[none,_]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(toplevel_show_store,[on,off]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(term_indexing,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(verbosity,[on,off]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(ht_removal,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(mixed_stores,[on,off]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(line_numbers,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(dynattr,[off,on]).
 | 
					 | 
				
			||||||
chr_pp_flag_definition(experiment,[off,on]).
 | 
					 | 
				
			||||||
	% emit compiler inferred code
 | 
					 | 
				
			||||||
chr_pp_flag_definition(verbose,[off,on]).
 | 
					 | 
				
			||||||
	% emit input code and output code
 | 
					 | 
				
			||||||
chr_pp_flag_definition(dump,[off,on]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_pp_flag_definition(declare_stored_constraints,[off,on]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_pp_flag(Name,Value) :-
 | 
					 | 
				
			||||||
	atom_concat('$chr_pp_',Name,GlobalVar),
 | 
					 | 
				
			||||||
	nb_getval(GlobalVar,V),
 | 
					 | 
				
			||||||
	( V == [] ->
 | 
					 | 
				
			||||||
		chr_pp_flag_definition(Name,[Value|_])
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		V = Value
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
% TODO: add whatever goes wrong with (debug,on), (optimize,full) combo here!
 | 
					 | 
				
			||||||
% trivial example of what does go wrong:
 | 
					 | 
				
			||||||
%	b <=> true.
 | 
					 | 
				
			||||||
% !!!
 | 
					 | 
				
			||||||
sanity_check :-
 | 
					 | 
				
			||||||
	chr_pp_flag(store_in_guards, on),
 | 
					 | 
				
			||||||
	chr_pp_flag(ai_observation_analysis, on),
 | 
					 | 
				
			||||||
	chr_warning(any, 'ai_observation_analysis should be turned off when using store_in_guards\n', []),
 | 
					 | 
				
			||||||
	fail.
 | 
					 | 
				
			||||||
sanity_check.
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
@@ -1,314 +0,0 @@
 | 
				
			|||||||
/*  $Id: chr_compiler_utility.pl,v 1.4 2008-03-13 17:43:13 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Author:        Tom Schrijvers
 | 
					 | 
				
			||||||
    E-mail:        Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2005-2006, K.U. Leuven
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
:- module(chr_compiler_utility,
 | 
					 | 
				
			||||||
	[ time/2
 | 
					 | 
				
			||||||
	, replicate/3
 | 
					 | 
				
			||||||
	, pair_all_with/3
 | 
					 | 
				
			||||||
	, conj2list/2
 | 
					 | 
				
			||||||
	, list2conj/2
 | 
					 | 
				
			||||||
	, disj2list/2
 | 
					 | 
				
			||||||
	, list2disj/2
 | 
					 | 
				
			||||||
	, variable_replacement/3
 | 
					 | 
				
			||||||
	, variable_replacement/4
 | 
					 | 
				
			||||||
	, identical_rules/2
 | 
					 | 
				
			||||||
	, identical_guarded_rules/2
 | 
					 | 
				
			||||||
	, copy_with_variable_replacement/3
 | 
					 | 
				
			||||||
	, my_term_copy/3
 | 
					 | 
				
			||||||
	, my_term_copy/4
 | 
					 | 
				
			||||||
	, atom_concat_list/2
 | 
					 | 
				
			||||||
	, atomic_concat/3
 | 
					 | 
				
			||||||
	, init/2
 | 
					 | 
				
			||||||
	, member2/3
 | 
					 | 
				
			||||||
	, select2/6
 | 
					 | 
				
			||||||
	, set_elems/2
 | 
					 | 
				
			||||||
	, instrument_goal/4
 | 
					 | 
				
			||||||
	, sort_by_key/3
 | 
					 | 
				
			||||||
	, arg1/3
 | 
					 | 
				
			||||||
	, wrap_in_functor/3
 | 
					 | 
				
			||||||
	, tree_set_empty/1
 | 
					 | 
				
			||||||
	, tree_set_memberchk/2
 | 
					 | 
				
			||||||
	, tree_set_add/3
 | 
					 | 
				
			||||||
	]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- use_module(pairlist).
 | 
					 | 
				
			||||||
:- use_module(library(lists), [permutation/2]).
 | 
					 | 
				
			||||||
:- use_module(library(assoc)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SICStus begin
 | 
					 | 
				
			||||||
%% use_module(library(terms),[term_variables/2]).
 | 
					 | 
				
			||||||
%% SICStus end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
% time(Phase,Goal) :-
 | 
					 | 
				
			||||||
% 	statistics(runtime,[T1|_]),
 | 
					 | 
				
			||||||
% 	call(Goal),
 | 
					 | 
				
			||||||
% 	statistics(runtime,[T2|_]),
 | 
					 | 
				
			||||||
% 	T is T2 - T1,
 | 
					 | 
				
			||||||
% 	format('    ~w ~46t ~D~80| ms\n',[Phase,T]),
 | 
					 | 
				
			||||||
% 	deterministic(Det),
 | 
					 | 
				
			||||||
% 	( Det == true ->
 | 
					 | 
				
			||||||
% 		true
 | 
					 | 
				
			||||||
% 	;
 | 
					 | 
				
			||||||
% 		format('\t\tNOT DETERMINISTIC!\n',[])
 | 
					 | 
				
			||||||
% 	).
 | 
					 | 
				
			||||||
time(_,Goal) :- call(Goal).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
replicate(N,E,L) :-
 | 
					 | 
				
			||||||
	( N =< 0 ->
 | 
					 | 
				
			||||||
		L = []
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		L = [E|T],
 | 
					 | 
				
			||||||
		M is N - 1,
 | 
					 | 
				
			||||||
		replicate(M,E,T)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
pair_all_with([],_,[]).
 | 
					 | 
				
			||||||
pair_all_with([X|Xs],Y,[X-Y|Rest]) :-
 | 
					 | 
				
			||||||
	pair_all_with(Xs,Y,Rest).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
conj2list(Conj,L) :-				%% transform conjunctions to list
 | 
					 | 
				
			||||||
  conj2list(Conj,L,[]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
conj2list(Var,L,T) :-
 | 
					 | 
				
			||||||
	var(Var), !,
 | 
					 | 
				
			||||||
	L = [Var|T].
 | 
					 | 
				
			||||||
conj2list(true,L,L) :- !.
 | 
					 | 
				
			||||||
conj2list(Conj,L,T) :-
 | 
					 | 
				
			||||||
  Conj = (G1,G2), !,
 | 
					 | 
				
			||||||
  conj2list(G1,L,T1),
 | 
					 | 
				
			||||||
  conj2list(G2,T1,T).
 | 
					 | 
				
			||||||
conj2list(G,[G | T],T).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
disj2list(Conj,L) :-				%% transform disjunctions to list
 | 
					 | 
				
			||||||
  disj2list(Conj,L,[]).
 | 
					 | 
				
			||||||
disj2list(Conj,L,T) :-
 | 
					 | 
				
			||||||
  Conj = (fail;G2), !,
 | 
					 | 
				
			||||||
  disj2list(G2,L,T).
 | 
					 | 
				
			||||||
disj2list(Conj,L,T) :-
 | 
					 | 
				
			||||||
  Conj = (G1;G2), !,
 | 
					 | 
				
			||||||
  disj2list(G1,L,T1),
 | 
					 | 
				
			||||||
  disj2list(G2,T1,T).
 | 
					 | 
				
			||||||
disj2list(G,[G | T],T).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
list2conj([],true).
 | 
					 | 
				
			||||||
list2conj([G],X) :- !, X = G.
 | 
					 | 
				
			||||||
list2conj([G|Gs],C) :-
 | 
					 | 
				
			||||||
	( G == true ->				%% remove some redundant trues
 | 
					 | 
				
			||||||
		list2conj(Gs,C)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		C = (G,R),
 | 
					 | 
				
			||||||
		list2conj(Gs,R)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
list2disj([],fail).
 | 
					 | 
				
			||||||
list2disj([G],X) :- !, X = G.
 | 
					 | 
				
			||||||
list2disj([G|Gs],C) :-
 | 
					 | 
				
			||||||
	( G == fail ->				%% remove some redundant fails
 | 
					 | 
				
			||||||
		list2disj(Gs,C)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		C = (G;R),
 | 
					 | 
				
			||||||
		list2disj(Gs,R)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
% check wether two rules are identical
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
identical_guarded_rules(rule(H11,H21,G1,_),rule(H12,H22,G2,_)) :-
 | 
					 | 
				
			||||||
   G1 == G2,
 | 
					 | 
				
			||||||
   permutation(H11,P1),
 | 
					 | 
				
			||||||
   P1 == H12,
 | 
					 | 
				
			||||||
   permutation(H21,P2),
 | 
					 | 
				
			||||||
   P2 == H22.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
identical_rules(rule(H11,H21,G1,B1),rule(H12,H22,G2,B2)) :-
 | 
					 | 
				
			||||||
   G1 == G2,
 | 
					 | 
				
			||||||
   identical_bodies(B1,B2),
 | 
					 | 
				
			||||||
   permutation(H11,P1),
 | 
					 | 
				
			||||||
   P1 == H12,
 | 
					 | 
				
			||||||
   permutation(H21,P2),
 | 
					 | 
				
			||||||
   P2 == H22.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
identical_bodies(B1,B2) :-
 | 
					 | 
				
			||||||
   ( B1 = (X1 = Y1),
 | 
					 | 
				
			||||||
     B2 = (X2 = Y2) ->
 | 
					 | 
				
			||||||
     ( X1 == X2,
 | 
					 | 
				
			||||||
       Y1 == Y2
 | 
					 | 
				
			||||||
     ; X1 == Y2,
 | 
					 | 
				
			||||||
       X2 == Y1
 | 
					 | 
				
			||||||
     ),
 | 
					 | 
				
			||||||
     !
 | 
					 | 
				
			||||||
   ; B1 == B2
 | 
					 | 
				
			||||||
   ).
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
% replace variables in list
 | 
					 | 
				
			||||||
   
 | 
					 | 
				
			||||||
copy_with_variable_replacement(X,Y,L) :-
 | 
					 | 
				
			||||||
   ( var(X) ->
 | 
					 | 
				
			||||||
     ( lookup_eq(L,X,Y) ->
 | 
					 | 
				
			||||||
       true
 | 
					 | 
				
			||||||
     ; X = Y
 | 
					 | 
				
			||||||
     )
 | 
					 | 
				
			||||||
   ; functor(X,F,A),
 | 
					 | 
				
			||||||
     functor(Y,F,A),
 | 
					 | 
				
			||||||
     X =.. [_|XArgs],
 | 
					 | 
				
			||||||
     Y =.. [_|YArgs],
 | 
					 | 
				
			||||||
     copy_with_variable_replacement_l(XArgs,YArgs,L)
 | 
					 | 
				
			||||||
   ).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
copy_with_variable_replacement_l([],[],_).
 | 
					 | 
				
			||||||
copy_with_variable_replacement_l([X|Xs],[Y|Ys],L) :-
 | 
					 | 
				
			||||||
   copy_with_variable_replacement(X,Y,L),
 | 
					 | 
				
			||||||
   copy_with_variable_replacement_l(Xs,Ys,L).
 | 
					 | 
				
			||||||
   
 | 
					 | 
				
			||||||
% build variable replacement list
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
variable_replacement(X,Y,L) :-
 | 
					 | 
				
			||||||
   variable_replacement(X,Y,[],L).
 | 
					 | 
				
			||||||
   
 | 
					 | 
				
			||||||
variable_replacement(X,Y,L1,L2) :-
 | 
					 | 
				
			||||||
   ( var(X) ->
 | 
					 | 
				
			||||||
     var(Y),
 | 
					 | 
				
			||||||
     ( lookup_eq(L1,X,Z) ->
 | 
					 | 
				
			||||||
       Z == Y,
 | 
					 | 
				
			||||||
       L2 = L1
 | 
					 | 
				
			||||||
     ; ( X == Y -> L2=L1 ; L2 = [X-Y,Y-X|L1])
 | 
					 | 
				
			||||||
     )
 | 
					 | 
				
			||||||
   ; X =.. [F|XArgs],
 | 
					 | 
				
			||||||
     nonvar(Y),
 | 
					 | 
				
			||||||
     Y =.. [F|YArgs],
 | 
					 | 
				
			||||||
     variable_replacement_l(XArgs,YArgs,L1,L2)
 | 
					 | 
				
			||||||
   ).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
variable_replacement_l([],[],L,L).
 | 
					 | 
				
			||||||
variable_replacement_l([X|Xs],[Y|Ys],L1,L3) :-
 | 
					 | 
				
			||||||
   variable_replacement(X,Y,L1,L2),
 | 
					 | 
				
			||||||
   variable_replacement_l(Xs,Ys,L2,L3).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
my_term_copy(X,Dict,Y) :-
 | 
					 | 
				
			||||||
   my_term_copy(X,Dict,_,Y).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
my_term_copy(X,Dict1,Dict2,Y) :-
 | 
					 | 
				
			||||||
   (   var(X) ->
 | 
					 | 
				
			||||||
       (   lookup_eq(Dict1,X,Y) ->
 | 
					 | 
				
			||||||
           Dict2 = Dict1
 | 
					 | 
				
			||||||
       ;   Dict2 = [X-Y|Dict1]
 | 
					 | 
				
			||||||
       )
 | 
					 | 
				
			||||||
   ;   functor(X,XF,XA),
 | 
					 | 
				
			||||||
       functor(Y,XF,XA),
 | 
					 | 
				
			||||||
       X =.. [_|XArgs],
 | 
					 | 
				
			||||||
       Y =.. [_|YArgs],
 | 
					 | 
				
			||||||
       my_term_copy_list(XArgs,Dict1,Dict2,YArgs)
 | 
					 | 
				
			||||||
   ).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
my_term_copy_list([],Dict,Dict,[]).
 | 
					 | 
				
			||||||
my_term_copy_list([X|Xs],Dict1,Dict3,[Y|Ys]) :-
 | 
					 | 
				
			||||||
   my_term_copy(X,Dict1,Dict2,Y),
 | 
					 | 
				
			||||||
   my_term_copy_list(Xs,Dict2,Dict3,Ys).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
atom_concat_list([X],X) :- ! .
 | 
					 | 
				
			||||||
atom_concat_list([X|Xs],A) :-
 | 
					 | 
				
			||||||
	atom_concat_list(Xs,B),
 | 
					 | 
				
			||||||
	atomic_concat(X,B,A).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
atomic_concat(A,B,C) :-
 | 
					 | 
				
			||||||
	make_atom(A,AA),
 | 
					 | 
				
			||||||
	make_atom(B,BB),
 | 
					 | 
				
			||||||
	atom_concat(AA,BB,C).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
make_atom(A,AA) :-
 | 
					 | 
				
			||||||
	(
 | 
					 | 
				
			||||||
	  atom(A) ->
 | 
					 | 
				
			||||||
	  AA = A
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
	  number(A) ->
 | 
					 | 
				
			||||||
	  number_codes(A,AL),
 | 
					 | 
				
			||||||
	  atom_codes(AA,AL)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set_elems([],_).
 | 
					 | 
				
			||||||
set_elems([X|Xs],X) :-
 | 
					 | 
				
			||||||
	set_elems(Xs,X).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
init([],[]).
 | 
					 | 
				
			||||||
init([_],[]) :- !.
 | 
					 | 
				
			||||||
init([X|Xs],[X|R]) :-
 | 
					 | 
				
			||||||
	init(Xs,R).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
member2([X|_],[Y|_],X-Y).
 | 
					 | 
				
			||||||
member2([_|Xs],[_|Ys],P) :-
 | 
					 | 
				
			||||||
	member2(Xs,Ys,P).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
select2(X, Y, [X|Xs], [Y|Ys], Xs, Ys).
 | 
					 | 
				
			||||||
select2(X, Y, [X1|Xs], [Y1|Ys], [X1|NXs], [Y1|NYs]) :-
 | 
					 | 
				
			||||||
	select2(X, Y, Xs, Ys, NXs, NYs).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
instrument_goal(Goal,Pre,Post,(Pre,Goal,Post)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sort_by_key(List,Keys,SortedList) :-
 | 
					 | 
				
			||||||
	pairup(Keys,List,Pairs),
 | 
					 | 
				
			||||||
	sort(Pairs,SortedPairs),
 | 
					 | 
				
			||||||
	once(pairup(_,SortedList,SortedPairs)).	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
arg1(Term,Index,Arg) :- arg(Index,Term,Arg).	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
wrap_in_functor(Functor,X,Term) :-
 | 
					 | 
				
			||||||
	Term =.. [Functor,X].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
tree_set_empty(TreeSet) :- empty_assoc(TreeSet).
 | 
					 | 
				
			||||||
tree_set_memberchk(Element,TreeSet) :- get_assoc(Element,TreeSet,_).
 | 
					 | 
				
			||||||
tree_set_add(TreeSet,Element,NTreeSet) :- put_assoc(Element,TreeSet,x,NTreeSet).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
:- dynamic
 | 
					 | 
				
			||||||
	user:goal_expansion/2.
 | 
					 | 
				
			||||||
:- multifile
 | 
					 | 
				
			||||||
	user:goal_expansion/2.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
user:goal_expansion(arg1(Term,Index,Arg), arg(Index,Term,Arg)).
 | 
					 | 
				
			||||||
user:goal_expansion(wrap_in_functor(Functor,In,Out), Goal) :-
 | 
					 | 
				
			||||||
	( atom(Functor), var(Out) ->
 | 
					 | 
				
			||||||
		Out =.. [Functor,In],
 | 
					 | 
				
			||||||
		Goal = true
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		Goal = (Out =.. [Functor,In])
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,62 +0,0 @@
 | 
				
			|||||||
/*  $Id: chr_debug.pl,v 1.3 2008-03-13 14:37:59 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Author:        Tom Schrijvers
 | 
					 | 
				
			||||||
    E-mail:        Tom.Schrijvers@cs.kuleuven.ac.be
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2003-2004, K.U. Leuven
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- module(chr_debug,
 | 
					 | 
				
			||||||
	  [ chr_show_store/1, % +Module
 | 
					 | 
				
			||||||
            find_chr_constraint/1
 | 
					 | 
				
			||||||
	  ]).
 | 
					 | 
				
			||||||
:- use_module(chr(chr_runtime)).
 | 
					 | 
				
			||||||
:- use_module(library(lists)).
 | 
					 | 
				
			||||||
:- set_prolog_flag(generate_debug_info, false).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	chr_show_store(+Module)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Prints all suspended constraints of module   Mod to the standard
 | 
					 | 
				
			||||||
%	output.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_show_store(Mod) :-
 | 
					 | 
				
			||||||
	(
 | 
					 | 
				
			||||||
		Mod:'$enumerate_suspensions'(Susp),
 | 
					 | 
				
			||||||
%		arg(6,Susp,C),
 | 
					 | 
				
			||||||
		Susp =.. [_,_,_,_,_,_,F|Arg],
 | 
					 | 
				
			||||||
		functor(F,Fun,_),
 | 
					 | 
				
			||||||
		C =.. [Fun|Arg],
 | 
					 | 
				
			||||||
		print(C),nl, % allows use of portray to control printing
 | 
					 | 
				
			||||||
		fail
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
find_chr_constraint(C) :-
 | 
					 | 
				
			||||||
	chr:'$chr_module'(Mod),
 | 
					 | 
				
			||||||
	Mod:'$enumerate_suspensions'(Susp),
 | 
					 | 
				
			||||||
	arg(6,Susp,C).
 | 
					 | 
				
			||||||
@@ -1,423 +0,0 @@
 | 
				
			|||||||
/*  $Id: chr_hashtable_store.pl,v 1.4 2008-03-13 17:43:13 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Author:        Tom Schrijvers
 | 
					 | 
				
			||||||
    E-mail:        Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2003-2004, K.U. Leuven
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
% author: Tom Schrijvers
 | 
					 | 
				
			||||||
% email:  Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
% copyright: K.U.Leuven, 2004
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- module(chr_hashtable_store,
 | 
					 | 
				
			||||||
	[ new_ht/1,
 | 
					 | 
				
			||||||
	  lookup_ht/3,
 | 
					 | 
				
			||||||
	  lookup_ht1/4,
 | 
					 | 
				
			||||||
	  lookup_ht2/4,
 | 
					 | 
				
			||||||
	  insert_ht/3,
 | 
					 | 
				
			||||||
	  insert_ht/4,
 | 
					 | 
				
			||||||
	  delete_ht/3,
 | 
					 | 
				
			||||||
	  delete_ht1/4,
 | 
					 | 
				
			||||||
	  delete_first_ht/3,
 | 
					 | 
				
			||||||
	  value_ht/2,
 | 
					 | 
				
			||||||
	  stats_ht/1,
 | 
					 | 
				
			||||||
	  stats_ht/1
 | 
					 | 
				
			||||||
	]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- use_module(pairlist).
 | 
					 | 
				
			||||||
:- use_module(hprolog).
 | 
					 | 
				
			||||||
:- use_module(library(lists)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- multifile user:goal_expansion/2.
 | 
					 | 
				
			||||||
:- dynamic user:goal_expansion/2.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
user:goal_expansion(term_hash(Term,Hash),hash_term(Term,Hash)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
% term_hash(Term,Hash) :-
 | 
					 | 
				
			||||||
% 	hash_term(Term,Hash).
 | 
					 | 
				
			||||||
initial_capacity(89).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
new_ht(HT) :-
 | 
					 | 
				
			||||||
	initial_capacity(Capacity),
 | 
					 | 
				
			||||||
	new_ht(Capacity,HT).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
new_ht(Capacity,HT) :-
 | 
					 | 
				
			||||||
	functor(T1,t,Capacity),
 | 
					 | 
				
			||||||
	HT = ht(Capacity,0,Table),
 | 
					 | 
				
			||||||
	Table = T1.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
lookup_ht(HT,Key,Values) :-
 | 
					 | 
				
			||||||
	term_hash(Key,Hash),
 | 
					 | 
				
			||||||
	lookup_ht1(HT,Hash,Key,Values).
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
	HT = ht(Capacity,_,Table),
 | 
					 | 
				
			||||||
	Index is (Hash mod Capacity) + 1,
 | 
					 | 
				
			||||||
	arg(Index,Table,Bucket),
 | 
					 | 
				
			||||||
	nonvar(Bucket),
 | 
					 | 
				
			||||||
	( Bucket = K-Vs ->
 | 
					 | 
				
			||||||
	    K == Key,	
 | 
					 | 
				
			||||||
	    Values = Vs
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
	    lookup(Bucket,Key,Values)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
% :- load_foreign_library(chr_support).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
lookup_ht1(HT,Hash,Key,Values) :-
 | 
					 | 
				
			||||||
	( lookup_ht1_(HT,Hash,Key,Values) ->
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		( lookup_ht1__(HT,Hash,Key,Values) ->
 | 
					 | 
				
			||||||
			writeln(lookup_ht1(HT,Hash,Key,Values)),
 | 
					 | 
				
			||||||
			throw(error)
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			fail
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
lookup_ht1(HT,Hash,Key,Values) :-
 | 
					 | 
				
			||||||
	HT = ht(Capacity,_,Table),
 | 
					 | 
				
			||||||
	Index is (Hash mod Capacity) + 1,
 | 
					 | 
				
			||||||
	arg(Index,Table,Bucket),
 | 
					 | 
				
			||||||
	nonvar(Bucket),
 | 
					 | 
				
			||||||
	( Bucket = K-Vs ->
 | 
					 | 
				
			||||||
	    K == Key,	
 | 
					 | 
				
			||||||
	    Values = Vs
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
	    lookup(Bucket,Key,Values)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
lookup_ht2(HT,Key,Values,Index) :-
 | 
					 | 
				
			||||||
	term_hash(Key,Hash),
 | 
					 | 
				
			||||||
	HT = ht(Capacity,_,Table),
 | 
					 | 
				
			||||||
	Index is (Hash mod Capacity) + 1,
 | 
					 | 
				
			||||||
	arg(Index,Table,Bucket),
 | 
					 | 
				
			||||||
	nonvar(Bucket),
 | 
					 | 
				
			||||||
	( Bucket = K-Vs ->
 | 
					 | 
				
			||||||
	    K == Key,	
 | 
					 | 
				
			||||||
	    Values = Vs
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
	    lookup(Bucket,Key,Values)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
lookup_pair_eq([P | KVs],Key,Pair) :-
 | 
					 | 
				
			||||||
	P = K-_,
 | 
					 | 
				
			||||||
	( K == Key ->
 | 
					 | 
				
			||||||
		P = Pair
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		lookup_pair_eq(KVs,Key,Pair)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
insert_ht(HT,Key,Value) :-
 | 
					 | 
				
			||||||
	term_hash(Key,Hash),
 | 
					 | 
				
			||||||
	HT = ht(Capacity0,Load,Table0),
 | 
					 | 
				
			||||||
	LookupIndex is (Hash mod Capacity0) + 1,
 | 
					 | 
				
			||||||
	arg(LookupIndex,Table0,LookupBucket),
 | 
					 | 
				
			||||||
	( var(LookupBucket) ->
 | 
					 | 
				
			||||||
		LookupBucket = Key - [Value]
 | 
					 | 
				
			||||||
	; LookupBucket = K-Values ->
 | 
					 | 
				
			||||||
		( K == Key ->	
 | 
					 | 
				
			||||||
			setarg(2,LookupBucket,[Value|Values])
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			setarg(LookupIndex,Table0,[Key-[Value],LookupBucket])
 | 
					 | 
				
			||||||
		)	
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
	      	( lookup_pair_eq(LookupBucket,Key,Pair) ->
 | 
					 | 
				
			||||||
			Pair = _-Values,
 | 
					 | 
				
			||||||
			setarg(2,Pair,[Value|Values])
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			setarg(LookupIndex,Table0,[Key-[Value]|LookupBucket])
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	NLoad is Load + 1,
 | 
					 | 
				
			||||||
	setarg(2,HT,NLoad),
 | 
					 | 
				
			||||||
	( Load == Capacity0 ->
 | 
					 | 
				
			||||||
		expand_ht(HT,_Capacity)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
insert_ht1(HT,Key,Hash,Value) :-
 | 
					 | 
				
			||||||
	HT = ht(Capacity0,Load,Table0),
 | 
					 | 
				
			||||||
	LookupIndex is (Hash mod Capacity0) + 1,
 | 
					 | 
				
			||||||
	arg(LookupIndex,Table0,LookupBucket),
 | 
					 | 
				
			||||||
	( var(LookupBucket) ->
 | 
					 | 
				
			||||||
		LookupBucket = Key - [Value]
 | 
					 | 
				
			||||||
	; LookupBucket = K-Values ->
 | 
					 | 
				
			||||||
		( K == Key ->	
 | 
					 | 
				
			||||||
			setarg(2,LookupBucket,[Value|Values])
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			setarg(LookupIndex,Table0,[Key-[Value],LookupBucket])
 | 
					 | 
				
			||||||
		)	
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
	      	( lookup_pair_eq(LookupBucket,Key,Pair) ->
 | 
					 | 
				
			||||||
			Pair = _-Values,
 | 
					 | 
				
			||||||
			setarg(2,Pair,[Value|Values])
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			setarg(LookupIndex,Table0,[Key-[Value]|LookupBucket])
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	NLoad is Load + 1,
 | 
					 | 
				
			||||||
	setarg(2,HT,NLoad),
 | 
					 | 
				
			||||||
	( Load == Capacity0 ->
 | 
					 | 
				
			||||||
		expand_ht(HT,_Capacity)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
% LDK: insert version with extra argument denoting result
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
insert_ht(HT,Key,Value,Result) :-
 | 
					 | 
				
			||||||
	HT = ht(Capacity,Load,Table),
 | 
					 | 
				
			||||||
	term_hash(Key,Hash),
 | 
					 | 
				
			||||||
	LookupIndex is (Hash mod Capacity) + 1,
 | 
					 | 
				
			||||||
	arg(LookupIndex,Table,LookupBucket),
 | 
					 | 
				
			||||||
	(   var(LookupBucket)
 | 
					 | 
				
			||||||
	->  Result = [Value],
 | 
					 | 
				
			||||||
	    LookupBucket = Key - Result,
 | 
					 | 
				
			||||||
	    NewLoad is Load + 1
 | 
					 | 
				
			||||||
	;   LookupBucket = K - V
 | 
					 | 
				
			||||||
	->  (   K = Key
 | 
					 | 
				
			||||||
	    ->  Result = [Value|V],
 | 
					 | 
				
			||||||
		setarg(2,LookupBucket,Result),
 | 
					 | 
				
			||||||
		NewLoad = Load
 | 
					 | 
				
			||||||
	    ;   Result = [Value],
 | 
					 | 
				
			||||||
		setarg(LookupIndex,Table,[Key - Result,LookupBucket]),
 | 
					 | 
				
			||||||
		NewLoad is Load + 1
 | 
					 | 
				
			||||||
	    )	
 | 
					 | 
				
			||||||
	;   (   lookup_pair_eq(LookupBucket,Key,Pair)
 | 
					 | 
				
			||||||
	    ->  Pair = _-Values,
 | 
					 | 
				
			||||||
		Result = [Value|Values],
 | 
					 | 
				
			||||||
		setarg(2,Pair,Result),
 | 
					 | 
				
			||||||
		NewLoad = Load
 | 
					 | 
				
			||||||
	    ;   Result = [Value],
 | 
					 | 
				
			||||||
		setarg(LookupIndex,Table,[Key - Result|LookupBucket]),
 | 
					 | 
				
			||||||
		NewLoad is Load + 1
 | 
					 | 
				
			||||||
	    )
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	setarg(2,HT,NewLoad),
 | 
					 | 
				
			||||||
	(   NewLoad > Capacity
 | 
					 | 
				
			||||||
	->  expand_ht(HT,_)
 | 
					 | 
				
			||||||
	;   true
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
% LDK: deletion of the first element of a bucket
 | 
					 | 
				
			||||||
delete_first_ht(HT,Key,Values) :-
 | 
					 | 
				
			||||||
	HT = ht(Capacity,Load,Table),
 | 
					 | 
				
			||||||
	term_hash(Key,Hash),
 | 
					 | 
				
			||||||
	Index is (Hash mod Capacity) + 1,
 | 
					 | 
				
			||||||
	arg(Index,Table,Bucket),
 | 
					 | 
				
			||||||
	(   Bucket = _-[_|Values]
 | 
					 | 
				
			||||||
	->  (   Values = []
 | 
					 | 
				
			||||||
	    ->  setarg(Index,Table,_),
 | 
					 | 
				
			||||||
		NewLoad is Load - 1
 | 
					 | 
				
			||||||
	    ;   setarg(2,Bucket,Values),
 | 
					 | 
				
			||||||
		NewLoad = Load
 | 
					 | 
				
			||||||
	    )
 | 
					 | 
				
			||||||
	;   lookup_pair_eq(Bucket,Key,Pair)
 | 
					 | 
				
			||||||
	->  Pair = _-[_|Values],
 | 
					 | 
				
			||||||
	    (   Values = []
 | 
					 | 
				
			||||||
	    ->  pairlist_delete_eq(Bucket,Key,NewBucket),
 | 
					 | 
				
			||||||
		(   NewBucket = []
 | 
					 | 
				
			||||||
		->  setarg(Index,Table,_)
 | 
					 | 
				
			||||||
		;   NewBucket = [OtherPair]
 | 
					 | 
				
			||||||
		->  setarg(Index,Table,OtherPair)
 | 
					 | 
				
			||||||
		;   setarg(Index,Table,NewBucket)
 | 
					 | 
				
			||||||
		),
 | 
					 | 
				
			||||||
		NewLoad is Load - 1
 | 
					 | 
				
			||||||
	    ;   setarg(2,Pair,Values),
 | 
					 | 
				
			||||||
		NewLoad = Load
 | 
					 | 
				
			||||||
	    )
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
delete_ht(HT,Key,Value) :-
 | 
					 | 
				
			||||||
	HT = ht(Capacity,Load,Table),
 | 
					 | 
				
			||||||
	NLoad is Load - 1,
 | 
					 | 
				
			||||||
	term_hash(Key,Hash),
 | 
					 | 
				
			||||||
	Index is (Hash mod Capacity) + 1,
 | 
					 | 
				
			||||||
	arg(Index,Table,Bucket),
 | 
					 | 
				
			||||||
	( /* var(Bucket) ->
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	; */ Bucket = _K-Vs ->
 | 
					 | 
				
			||||||
		( /* _K == Key, */
 | 
					 | 
				
			||||||
		  delete_first_fail(Vs,Value,NVs) ->
 | 
					 | 
				
			||||||
			setarg(2,HT,NLoad),
 | 
					 | 
				
			||||||
			( NVs == [] ->
 | 
					 | 
				
			||||||
				setarg(Index,Table,_)
 | 
					 | 
				
			||||||
			;
 | 
					 | 
				
			||||||
				setarg(2,Bucket,NVs)
 | 
					 | 
				
			||||||
			)
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			true
 | 
					 | 
				
			||||||
		)	
 | 
					 | 
				
			||||||
	; 
 | 
					 | 
				
			||||||
		( lookup_pair_eq(Bucket,Key,Pair),
 | 
					 | 
				
			||||||
		  Pair = _-Vs,
 | 
					 | 
				
			||||||
		  delete_first_fail(Vs,Value,NVs) ->
 | 
					 | 
				
			||||||
			setarg(2,HT,NLoad),
 | 
					 | 
				
			||||||
			( NVs == [] ->
 | 
					 | 
				
			||||||
				pairlist_delete_eq(Bucket,Key,NBucket),
 | 
					 | 
				
			||||||
				( NBucket = [Singleton] ->
 | 
					 | 
				
			||||||
					setarg(Index,Table,Singleton)
 | 
					 | 
				
			||||||
				;
 | 
					 | 
				
			||||||
					setarg(Index,Table,NBucket)
 | 
					 | 
				
			||||||
				)
 | 
					 | 
				
			||||||
			;
 | 
					 | 
				
			||||||
				setarg(2,Pair,NVs)
 | 
					 | 
				
			||||||
			)
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			true
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
delete_first_fail([X | Xs], Y, Zs) :-
 | 
					 | 
				
			||||||
	( X == Y ->
 | 
					 | 
				
			||||||
		Zs = Xs
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		Zs = [X | Zs1],
 | 
					 | 
				
			||||||
		delete_first_fail(Xs, Y, Zs1)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
delete_ht1(HT,Key,Value,Index) :-
 | 
					 | 
				
			||||||
	HT = ht(_Capacity,Load,Table),
 | 
					 | 
				
			||||||
	NLoad is Load - 1,
 | 
					 | 
				
			||||||
	% term_hash(Key,Hash),
 | 
					 | 
				
			||||||
	% Index is (Hash mod _Capacity) + 1,
 | 
					 | 
				
			||||||
	arg(Index,Table,Bucket),
 | 
					 | 
				
			||||||
	( /* var(Bucket) ->
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	; */ Bucket = _K-Vs ->
 | 
					 | 
				
			||||||
		( /* _K == Key, */
 | 
					 | 
				
			||||||
		  delete_first_fail(Vs,Value,NVs) ->
 | 
					 | 
				
			||||||
			setarg(2,HT,NLoad),
 | 
					 | 
				
			||||||
			( NVs == [] ->
 | 
					 | 
				
			||||||
				setarg(Index,Table,_)
 | 
					 | 
				
			||||||
			;
 | 
					 | 
				
			||||||
				setarg(2,Bucket,NVs)
 | 
					 | 
				
			||||||
			)
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			true
 | 
					 | 
				
			||||||
		)	
 | 
					 | 
				
			||||||
	; 
 | 
					 | 
				
			||||||
		( lookup_pair_eq(Bucket,Key,Pair),
 | 
					 | 
				
			||||||
		  Pair = _-Vs,
 | 
					 | 
				
			||||||
		  delete_first_fail(Vs,Value,NVs) ->
 | 
					 | 
				
			||||||
			setarg(2,HT,NLoad),
 | 
					 | 
				
			||||||
			( NVs == [] ->
 | 
					 | 
				
			||||||
				pairlist_delete_eq(Bucket,Key,NBucket),
 | 
					 | 
				
			||||||
				( NBucket = [Singleton] ->
 | 
					 | 
				
			||||||
					setarg(Index,Table,Singleton)
 | 
					 | 
				
			||||||
				;
 | 
					 | 
				
			||||||
					setarg(Index,Table,NBucket)
 | 
					 | 
				
			||||||
				)
 | 
					 | 
				
			||||||
			;
 | 
					 | 
				
			||||||
				setarg(2,Pair,NVs)
 | 
					 | 
				
			||||||
			)
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			true
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
value_ht(HT,Value) :-
 | 
					 | 
				
			||||||
	HT = ht(Capacity,_,Table),
 | 
					 | 
				
			||||||
	value_ht(1,Capacity,Table,Value).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
value_ht(I,N,Table,Value) :-
 | 
					 | 
				
			||||||
	I =< N,
 | 
					 | 
				
			||||||
	arg(I,Table,Bucket),
 | 
					 | 
				
			||||||
	(
 | 
					 | 
				
			||||||
		nonvar(Bucket),
 | 
					 | 
				
			||||||
		( Bucket = _-Vs ->
 | 
					 | 
				
			||||||
			true
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			member(_-Vs,Bucket)
 | 
					 | 
				
			||||||
		),
 | 
					 | 
				
			||||||
		member(Value,Vs)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		J is I + 1,
 | 
					 | 
				
			||||||
		value_ht(J,N,Table,Value)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
expand_ht(HT,NewCapacity) :-
 | 
					 | 
				
			||||||
	HT = ht(Capacity,_,Table),
 | 
					 | 
				
			||||||
	NewCapacity is Capacity * 2 + 1,
 | 
					 | 
				
			||||||
	functor(NewTable,t,NewCapacity),
 | 
					 | 
				
			||||||
	setarg(1,HT,NewCapacity),
 | 
					 | 
				
			||||||
	setarg(3,HT,NewTable),
 | 
					 | 
				
			||||||
	expand_copy(Table,1,Capacity,NewTable,NewCapacity).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
expand_copy(Table,I,N,NewTable,NewCapacity) :-
 | 
					 | 
				
			||||||
	( I > N ->
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		arg(I,Table,Bucket),
 | 
					 | 
				
			||||||
		( var(Bucket) ->
 | 
					 | 
				
			||||||
			true
 | 
					 | 
				
			||||||
		; Bucket = Key - Value ->
 | 
					 | 
				
			||||||
			expand_insert(NewTable,NewCapacity,Key,Value)
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			expand_inserts(Bucket,NewTable,NewCapacity)
 | 
					 | 
				
			||||||
		),
 | 
					 | 
				
			||||||
		J is I + 1,
 | 
					 | 
				
			||||||
		expand_copy(Table,J,N,NewTable,NewCapacity)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
expand_inserts([],_,_).
 | 
					 | 
				
			||||||
expand_inserts([K-V|R],Table,Capacity) :-
 | 
					 | 
				
			||||||
	expand_insert(Table,Capacity,K,V),
 | 
					 | 
				
			||||||
	expand_inserts(R,Table,Capacity).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
expand_insert(Table,Capacity,K,V) :-
 | 
					 | 
				
			||||||
	term_hash(K,Hash),	
 | 
					 | 
				
			||||||
	Index is (Hash mod Capacity) + 1,
 | 
					 | 
				
			||||||
	arg(Index,Table,Bucket),
 | 
					 | 
				
			||||||
	( var(Bucket) ->
 | 
					 | 
				
			||||||
		Bucket = K - V
 | 
					 | 
				
			||||||
	; Bucket = _-_ ->
 | 
					 | 
				
			||||||
		setarg(Index,Table,[K-V,Bucket])
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		setarg(Index,Table,[K-V|Bucket])
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
stats_ht(HT) :-	
 | 
					 | 
				
			||||||
	HT = ht(Capacity,Load,Table),
 | 
					 | 
				
			||||||
	format('HT load = ~w / ~w\n',[Load,Capacity]),
 | 
					 | 
				
			||||||
	( between(1,Capacity,Index),
 | 
					 | 
				
			||||||
		arg(Index,Table,Entry),
 | 
					 | 
				
			||||||
		( var(Entry)  -> Size = 0
 | 
					 | 
				
			||||||
		; Entry = _-_ -> Size = 1
 | 
					 | 
				
			||||||
		; length(Entry,Size)
 | 
					 | 
				
			||||||
		),
 | 
					 | 
				
			||||||
		format('~w : ~w\n',[Index,Size]),
 | 
					 | 
				
			||||||
		fail
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
@@ -1,136 +0,0 @@
 | 
				
			|||||||
/*  $Id: chr_integertable_store.pl,v 1.3 2008-03-13 14:37:59 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    based on chr_hashtable_store (by Tom Schrijvers)
 | 
					 | 
				
			||||||
    Author:        Jon Sneyers
 | 
					 | 
				
			||||||
    E-mail:        Jon.Sneyers@cs.kuleuven.be
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2005, K.U. Leuven
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
% is it safe to use nb_setarg here?
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- module(chr_integertable_store,
 | 
					 | 
				
			||||||
	[ new_iht/1,
 | 
					 | 
				
			||||||
	  lookup_iht/3,
 | 
					 | 
				
			||||||
	  insert_iht/3,
 | 
					 | 
				
			||||||
	  delete_iht/3,
 | 
					 | 
				
			||||||
	  value_iht/2
 | 
					 | 
				
			||||||
	]).
 | 
					 | 
				
			||||||
:- use_module(library(lists)).
 | 
					 | 
				
			||||||
:- use_module(hprolog).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%initial_capacity(65536).
 | 
					 | 
				
			||||||
%initial_capacity(1024).
 | 
					 | 
				
			||||||
initial_capacity(8).
 | 
					 | 
				
			||||||
%initial_capacity(2).
 | 
					 | 
				
			||||||
%initial_capacity(1).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
new_iht(HT) :-
 | 
					 | 
				
			||||||
	initial_capacity(Capacity),
 | 
					 | 
				
			||||||
	new_iht(Capacity,HT).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
new_iht(Capacity,HT) :-
 | 
					 | 
				
			||||||
        functor(T1,t,Capacity),
 | 
					 | 
				
			||||||
        HT = ht(Capacity,Table),
 | 
					 | 
				
			||||||
        Table = T1.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
lookup_iht(ht(_,Table),Int,Values) :-
 | 
					 | 
				
			||||||
	Index is Int + 1,
 | 
					 | 
				
			||||||
	arg(Index,Table,Values),
 | 
					 | 
				
			||||||
        Values \= [].
 | 
					 | 
				
			||||||
%	nonvar(Values).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
insert_iht(HT,Int,Value) :-
 | 
					 | 
				
			||||||
	Index is Int + 1,
 | 
					 | 
				
			||||||
	arg(2,HT,Table),
 | 
					 | 
				
			||||||
	(arg(Index,Table,Bucket) ->
 | 
					 | 
				
			||||||
	    ( var(Bucket) ->
 | 
					 | 
				
			||||||
	    	Bucket = [Value]
 | 
					 | 
				
			||||||
	    ;
 | 
					 | 
				
			||||||
		setarg(Index,Table,[Value|Bucket])
 | 
					 | 
				
			||||||
	    )
 | 
					 | 
				
			||||||
	;	% index > capacity
 | 
					 | 
				
			||||||
		Capacity is 1<<ceil(log(Index)/log(2)),
 | 
					 | 
				
			||||||
		expand_iht(HT,Capacity),
 | 
					 | 
				
			||||||
		insert_iht(HT,Int,Value)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
delete_iht(ht(_,Table),Int,Value) :-
 | 
					 | 
				
			||||||
%	arg(2,HT,Table),
 | 
					 | 
				
			||||||
	Index is Int + 1,
 | 
					 | 
				
			||||||
	arg(Index,Table,Bucket),
 | 
					 | 
				
			||||||
	( Bucket = [_Value] ->
 | 
					 | 
				
			||||||
		setarg(Index,Table,[])
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		delete_first_fail(Bucket,Value,NBucket),
 | 
					 | 
				
			||||||
		setarg(Index,Table,NBucket)
 | 
					 | 
				
			||||||
        ).
 | 
					 | 
				
			||||||
%delete_first_fail([], Y, []).
 | 
					 | 
				
			||||||
%delete_first_fail([_], _, []) :- !.
 | 
					 | 
				
			||||||
delete_first_fail([X | Xs], Y, Xs) :-
 | 
					 | 
				
			||||||
	X == Y, !.
 | 
					 | 
				
			||||||
delete_first_fail([X | Xs], Y, [X | Zs]) :-
 | 
					 | 
				
			||||||
	delete_first_fail(Xs, Y, Zs).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
value_iht(HT,Value) :-
 | 
					 | 
				
			||||||
	HT = ht(Capacity,Table),
 | 
					 | 
				
			||||||
	value_iht(1,Capacity,Table,Value).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
value_iht(I,N,Table,Value) :-
 | 
					 | 
				
			||||||
	I =< N,
 | 
					 | 
				
			||||||
	arg(I,Table,Bucket),
 | 
					 | 
				
			||||||
	(
 | 
					 | 
				
			||||||
		nonvar(Bucket),
 | 
					 | 
				
			||||||
		member(Value,Bucket)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		J is I + 1,
 | 
					 | 
				
			||||||
		value_iht(J,N,Table,Value)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
		 	
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
expand_iht(HT,NewCapacity) :-
 | 
					 | 
				
			||||||
	HT = ht(Capacity,Table),
 | 
					 | 
				
			||||||
	functor(NewTable,t,NewCapacity),
 | 
					 | 
				
			||||||
	setarg(1,HT,NewCapacity),
 | 
					 | 
				
			||||||
	setarg(2,HT,NewTable),
 | 
					 | 
				
			||||||
	expand_copy(Table,1,Capacity,NewTable,NewCapacity).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
expand_copy(Table,I,N,NewTable,NewCapacity) :-
 | 
					 | 
				
			||||||
	( I > N ->
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		arg(I,Table,Bucket),
 | 
					 | 
				
			||||||
		( var(Bucket) ->
 | 
					 | 
				
			||||||
			true
 | 
					 | 
				
			||||||
		; 
 | 
					 | 
				
			||||||
			arg(I,NewTable,Bucket)
 | 
					 | 
				
			||||||
		),
 | 
					 | 
				
			||||||
		J is I + 1,
 | 
					 | 
				
			||||||
		expand_copy(Table,J,N,NewTable,NewCapacity)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
@@ -1,173 +0,0 @@
 | 
				
			|||||||
/*  $Id: chr_messages.pl,v 1.3 2008-03-13 14:37:59 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Author:        Jan Wielemaker and Tom Schrijvers
 | 
					 | 
				
			||||||
    E-mail:        Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2003-2004, K.U. Leuven
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- module(chr_messages,
 | 
					 | 
				
			||||||
	  [ chr_message/3		% +CHR Message, Out, Rest
 | 
					 | 
				
			||||||
	  ]).
 | 
					 | 
				
			||||||
:- use_module(chr(chr_runtime)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- discontiguous
 | 
					 | 
				
			||||||
	chr_message/3.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	compiler messages
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_message(compilation_failed(From)) -->
 | 
					 | 
				
			||||||
	[ 'CHR Failed to compile ~w'-[From] ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	debug messages
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_message(prompt) -->
 | 
					 | 
				
			||||||
	[ at_same_line, ' ? ', flush ].
 | 
					 | 
				
			||||||
chr_message(command(Command)) -->
 | 
					 | 
				
			||||||
	[ at_same_line, '[~w]'-[Command] ].
 | 
					 | 
				
			||||||
chr_message(invalid_command) -->
 | 
					 | 
				
			||||||
	[ nl, 'CHR: Not a valid debug option.  Use ? for help.' ].
 | 
					 | 
				
			||||||
chr_message(debug_options) -->
 | 
					 | 
				
			||||||
	{ bagof(Ls-Cmd,
 | 
					 | 
				
			||||||
		bagof(L, 'chr debug command'(L, Cmd), Ls),
 | 
					 | 
				
			||||||
		Lines)
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	[ 'CHR Debugger commands:', nl, nl ],
 | 
					 | 
				
			||||||
	debug_commands(Lines),
 | 
					 | 
				
			||||||
	[ nl ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
debug_commands([]) -->
 | 
					 | 
				
			||||||
	[].
 | 
					 | 
				
			||||||
debug_commands([Ls-Cmd|T]) -->
 | 
					 | 
				
			||||||
	[ '\t' ], chars(Ls), [ '~t~28|~w'-[Cmd], nl ],
 | 
					 | 
				
			||||||
	debug_commands(T).
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
chars([C]) --> !,
 | 
					 | 
				
			||||||
	char(C).
 | 
					 | 
				
			||||||
chars([C|T]) -->
 | 
					 | 
				
			||||||
	char(C), [', '],
 | 
					 | 
				
			||||||
	chars(T).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
char(' ') --> !, ['<space>'].
 | 
					 | 
				
			||||||
char('\r') --> !, ['<cr>'].
 | 
					 | 
				
			||||||
char(end_of_file) --> !, ['EOF'].
 | 
					 | 
				
			||||||
char(C) --> [C].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_message(ancestors(History, Depth)) -->
 | 
					 | 
				
			||||||
	[ 'CHR Ancestors:', nl ],
 | 
					 | 
				
			||||||
	ancestors(History, Depth).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ancestors([], _) -->
 | 
					 | 
				
			||||||
	[].
 | 
					 | 
				
			||||||
ancestors([Event|Events], Depth) -->
 | 
					 | 
				
			||||||
	[ '\t' ], event(Event, Depth), [ nl ],
 | 
					 | 
				
			||||||
	{ NDepth is Depth - 1
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	ancestors(Events, NDepth).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	debugging ports
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_message(event(Port, Depth)) -->
 | 
					 | 
				
			||||||
	[ 'CHR: ' ],
 | 
					 | 
				
			||||||
	event(Port, Depth),
 | 
					 | 
				
			||||||
	[ flush ].			% do not emit a newline
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
event(Port, Depth) -->
 | 
					 | 
				
			||||||
	depth(Depth),
 | 
					 | 
				
			||||||
	port(Port).
 | 
					 | 
				
			||||||
event(apply(H1,H2,G,B), Depth) -->
 | 
					 | 
				
			||||||
	depth(Depth),
 | 
					 | 
				
			||||||
	[ 'Apply: ' ],
 | 
					 | 
				
			||||||
	rule(H1,H2,G,B).
 | 
					 | 
				
			||||||
event(try(H1,H2,G,B), Depth) -->
 | 
					 | 
				
			||||||
	depth(Depth),
 | 
					 | 
				
			||||||
	[ 'Try: ' ],
 | 
					 | 
				
			||||||
	rule(H1,H2,G,B).
 | 
					 | 
				
			||||||
event(insert(#(_,Susp)), Depth) -->
 | 
					 | 
				
			||||||
	depth(Depth),
 | 
					 | 
				
			||||||
	[ 'Insert: ' ],
 | 
					 | 
				
			||||||
	head(Susp).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
port(call(Susp)) -->
 | 
					 | 
				
			||||||
	[ 'Call: ' ],
 | 
					 | 
				
			||||||
	head(Susp).
 | 
					 | 
				
			||||||
port(wake(Susp)) -->
 | 
					 | 
				
			||||||
	[ 'Wake: ' ],
 | 
					 | 
				
			||||||
	head(Susp).
 | 
					 | 
				
			||||||
port(exit(Susp)) -->
 | 
					 | 
				
			||||||
	[ 'Exit: ' ],
 | 
					 | 
				
			||||||
	head(Susp).
 | 
					 | 
				
			||||||
port(fail(Susp)) -->
 | 
					 | 
				
			||||||
	[ 'Fail: ' ],
 | 
					 | 
				
			||||||
	head(Susp).
 | 
					 | 
				
			||||||
port(redo(Susp)) -->
 | 
					 | 
				
			||||||
	[ 'Redo: ' ],
 | 
					 | 
				
			||||||
	head(Susp).
 | 
					 | 
				
			||||||
port(remove(Susp)) -->
 | 
					 | 
				
			||||||
	[ 'Remove: ' ],
 | 
					 | 
				
			||||||
	head(Susp).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
depth(Depth) -->
 | 
					 | 
				
			||||||
	[ '~t(~D)~10| '-[Depth] ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
head(Susp) -->
 | 
					 | 
				
			||||||
	{ Susp =.. [_,ID,_,_,_,_|GoalArgs], Goal =.. GoalArgs
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	[ '~w # <~w>'-[Goal, ID] ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
heads([H]) --> !,
 | 
					 | 
				
			||||||
	head(H).
 | 
					 | 
				
			||||||
heads([H|T]) -->
 | 
					 | 
				
			||||||
	head(H),
 | 
					 | 
				
			||||||
	[ ', ' ],
 | 
					 | 
				
			||||||
	heads(T).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	rule(H1, H2, G, B)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Produce text for the CHR rule "H1 \ H2 [<=]=> G | B"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
rule(H1, H2, G, B) -->
 | 
					 | 
				
			||||||
	rule_head(H1, H2),
 | 
					 | 
				
			||||||
	rule_body(G, B).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
rule_head([], H2) --> !,
 | 
					 | 
				
			||||||
	heads(H2),
 | 
					 | 
				
			||||||
	[ ' ==> ' ].
 | 
					 | 
				
			||||||
rule_head(H1, []) --> !,
 | 
					 | 
				
			||||||
	heads(H1),
 | 
					 | 
				
			||||||
	[ ' <=> ' ].
 | 
					 | 
				
			||||||
rule_head(H1, H2) -->
 | 
					 | 
				
			||||||
	heads(H2), [ ' \\ ' ], heads(H1), [' <=> '].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
rule_body(true, B) --> !,
 | 
					 | 
				
			||||||
	[ '~w.'-[B] ].
 | 
					 | 
				
			||||||
rule_body(G, B) -->
 | 
					 | 
				
			||||||
	[ '~w | ~w.'-[G, B] ].
 | 
					 | 
				
			||||||
@@ -1,50 +0,0 @@
 | 
				
			|||||||
/*  $Id: chr_op.pl,v 1.3 2008-03-13 14:38:00 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Author:        Tom Schrijvers
 | 
					 | 
				
			||||||
    E-mail:        Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2003-2004, K.U. Leuven
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%% Operator Priorities
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- op(1180, xfx, ==>).
 | 
					 | 
				
			||||||
:- op(1180, xfx, <=>).
 | 
					 | 
				
			||||||
:- op(1150, fx, constraints).
 | 
					 | 
				
			||||||
:- op(1150, fx, chr_constraint).
 | 
					 | 
				
			||||||
:- op(1150, fx, handler).
 | 
					 | 
				
			||||||
:- op(1150, fx, rules).
 | 
					 | 
				
			||||||
:- op(1100, xfx, \).
 | 
					 | 
				
			||||||
:- op(1200, xfx, @).			% values from hProlog
 | 
					 | 
				
			||||||
:- op(1190, xfx, pragma).		% values from hProlog
 | 
					 | 
				
			||||||
:- op( 500, yfx, #).			% values from hProlog
 | 
					 | 
				
			||||||
%:- op(1100, xfx, '|').
 | 
					 | 
				
			||||||
:- op(1150, fx, chr_type).
 | 
					 | 
				
			||||||
:- op(1130, xfx, --->).
 | 
					 | 
				
			||||||
:- op(1150, fx, (?)).
 | 
					 | 
				
			||||||
:- op(1150, fx, chr_declaration).
 | 
					 | 
				
			||||||
@@ -1,51 +0,0 @@
 | 
				
			|||||||
/*  $Id: chr_op2.pl,v 1.3 2008-03-13 14:38:00 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Author:        Tom Schrijvers
 | 
					 | 
				
			||||||
    E-mail:        Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2003-2004, K.U. Leuven
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%% Operator Priorities
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
% old version, without the type/mode operators
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- op(1180, xfx, ==>).
 | 
					 | 
				
			||||||
:- op(1180, xfx, <=>).
 | 
					 | 
				
			||||||
:- op(1150, fx, constraints).
 | 
					 | 
				
			||||||
:- op(1150, fx, chr_constraint).
 | 
					 | 
				
			||||||
:- op(1150, fx, handler).
 | 
					 | 
				
			||||||
:- op(1150, fx, rules).
 | 
					 | 
				
			||||||
:- op(1100, xfx, \).
 | 
					 | 
				
			||||||
:- op(1200, xfx, @).			% values from hProlog
 | 
					 | 
				
			||||||
:- op(1190, xfx, pragma).		% values from hProlog
 | 
					 | 
				
			||||||
:- op( 500, yfx, #).			% values from hProlog
 | 
					 | 
				
			||||||
%:- op(1100, xfx, '|').
 | 
					 | 
				
			||||||
%:- op(1150, fx, chr_type).
 | 
					 | 
				
			||||||
%:- op(1130, xfx, --->).
 | 
					 | 
				
			||||||
@@ -1,902 +0,0 @@
 | 
				
			|||||||
/*  $Id: chr_runtime.pl,v 1.3 2008-03-13 14:38:00 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Author:        Christian Holzbaur and Tom Schrijvers
 | 
					 | 
				
			||||||
    E-mail:        christian@ai.univie.ac.at
 | 
					 | 
				
			||||||
		   Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2003-2004, K.U. Leuven
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Distributed with SWI-Prolog under the above conditions with
 | 
					 | 
				
			||||||
    permission from the authors.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%%       _                             _   _                
 | 
					 | 
				
			||||||
%%   ___| |__  _ __   _ __ _   _ _ __ | |_(_)_ __ ___   ___ 
 | 
					 | 
				
			||||||
%%  / __| '_ \| '__| | '__| | | | '_ \| __| | '_ ` _ \ / _ \
 | 
					 | 
				
			||||||
%% | (__| | | | |    | |  | |_| | | | | |_| | | | | | |  __/
 | 
					 | 
				
			||||||
%%  \___|_| |_|_|    |_|   \__,_|_| |_|\__|_|_| |_| |_|\___|
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%% hProlog CHR runtime:
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%% 	* based on the SICStus CHR runtime by Christian Holzbaur
 | 
					 | 
				
			||||||
%% 
 | 
					 | 
				
			||||||
%%          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%%          %  Constraint Handling Rules		      version 2.2 %
 | 
					 | 
				
			||||||
%%          %								  %
 | 
					 | 
				
			||||||
%%          %  (c) Copyright 1996-98					  %
 | 
					 | 
				
			||||||
%%          %  LMU, Muenchen						  %
 | 
					 | 
				
			||||||
%% 	    %								  %
 | 
					 | 
				
			||||||
%%          %  File:   chr.pl						  %
 | 
					 | 
				
			||||||
%%          %  Author: Christian Holzbaur	christian@ai.univie.ac.at %
 | 
					 | 
				
			||||||
%%          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%% 
 | 
					 | 
				
			||||||
%%	
 | 
					 | 
				
			||||||
%%	* modified by Tom Schrijvers, K.U.Leuven, Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
%%		- ported to hProlog
 | 
					 | 
				
			||||||
%%		- modified for eager suspension removal
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%%      * First working version: 6 June 2003
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%% SWI-Prolog changes
 | 
					 | 
				
			||||||
%% 
 | 
					 | 
				
			||||||
%% 	* Added initialization directives for saved-states
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- module(chr_runtime,
 | 
					 | 
				
			||||||
	  [ 'chr sbag_del_element'/3,
 | 
					 | 
				
			||||||
	    'chr sbag_member'/2,
 | 
					 | 
				
			||||||
	    'chr merge_attributes'/3,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    'chr run_suspensions'/1,
 | 
					 | 
				
			||||||
	    'chr run_suspensions_loop'/1,
 | 
					 | 
				
			||||||
	    
 | 
					 | 
				
			||||||
	    'chr run_suspensions_d'/1,
 | 
					 | 
				
			||||||
	    'chr run_suspensions_loop_d'/1,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    'chr insert_constraint_internal'/5,
 | 
					 | 
				
			||||||
	    'chr remove_constraint_internal'/2,
 | 
					 | 
				
			||||||
	    'chr allocate_constraint'/4,
 | 
					 | 
				
			||||||
	    'chr activate_constraint'/3,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    'chr default_store'/1,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    'chr via_1'/2,
 | 
					 | 
				
			||||||
	    'chr via_2'/3,
 | 
					 | 
				
			||||||
	    'chr via'/2,
 | 
					 | 
				
			||||||
	    'chr newvia_1'/2,
 | 
					 | 
				
			||||||
	    'chr newvia_2'/3,
 | 
					 | 
				
			||||||
	    'chr newvia'/2,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    'chr lock'/1,
 | 
					 | 
				
			||||||
	    'chr unlock'/1,
 | 
					 | 
				
			||||||
	    'chr not_locked'/1,
 | 
					 | 
				
			||||||
	    'chr none_locked'/1,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    'chr update_mutable'/2,
 | 
					 | 
				
			||||||
	    'chr get_mutable'/2,
 | 
					 | 
				
			||||||
	    'chr create_mutable'/2,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    'chr novel_production'/2,
 | 
					 | 
				
			||||||
	    'chr extend_history'/2,
 | 
					 | 
				
			||||||
	    'chr empty_history'/1,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    'chr gen_id'/1,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    'chr debug_event'/1,
 | 
					 | 
				
			||||||
	    'chr debug command'/2,	% Char, Command
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    'chr chr_indexed_variables'/2,
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
	    'chr all_suspensions'/3,
 | 
					 | 
				
			||||||
	    'chr new_merge_attributes'/3,
 | 
					 | 
				
			||||||
	    'chr normalize_attr'/2,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    'chr select'/3,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    chr_show_store/1,	% +Module
 | 
					 | 
				
			||||||
	    find_chr_constraint/1,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    chr_trace/0,
 | 
					 | 
				
			||||||
	    chr_notrace/0,
 | 
					 | 
				
			||||||
	    chr_leash/1
 | 
					 | 
				
			||||||
	  ]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
:- set_prolog_flag(generate_debug_info, false).
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
                                                       
 | 
					 | 
				
			||||||
:- use_module(hprolog).
 | 
					 | 
				
			||||||
:- include(chr_op).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SICStus begin
 | 
					 | 
				
			||||||
%% :- use_module(hpattvars).
 | 
					 | 
				
			||||||
%% :- use_module(b_globval).
 | 
					 | 
				
			||||||
%% SICStus end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%   I N I T I A L I S A T I O N
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
:- dynamic user:exception/3.
 | 
					 | 
				
			||||||
:- multifile user:exception/3.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
user:exception(undefined_global_variable, Name, retry) :-
 | 
					 | 
				
			||||||
	chr_runtime_global_variable(Name),
 | 
					 | 
				
			||||||
	chr_init.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_runtime_global_variable(chr_id).
 | 
					 | 
				
			||||||
chr_runtime_global_variable(chr_global).
 | 
					 | 
				
			||||||
chr_runtime_global_variable(chr_debug).
 | 
					 | 
				
			||||||
chr_runtime_global_variable(chr_debug_history).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_init :-
 | 
					 | 
				
			||||||
	nb_setval(chr_id,0),
 | 
					 | 
				
			||||||
	nb_setval(chr_global,_),
 | 
					 | 
				
			||||||
	nb_setval(chr_debug,mutable(off)),          % XXX
 | 
					 | 
				
			||||||
	nb_setval(chr_debug_history,mutable([],0)). % XXX
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SICStus begin
 | 
					 | 
				
			||||||
%% chr_init :-
 | 
					 | 
				
			||||||
%% 	        nb_setval(chr_id,0).
 | 
					 | 
				
			||||||
%% SICStus end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- initialization chr_init.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
% Contents of former chr_debug.pl
 | 
					 | 
				
			||||||
%   
 | 
					 | 
				
			||||||
%	chr_show_store(+Module)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Prints all suspended constraints of module   Mod to the standard
 | 
					 | 
				
			||||||
%	output.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_show_store(Mod) :-
 | 
					 | 
				
			||||||
	(
 | 
					 | 
				
			||||||
		Mod:'$enumerate_constraints'(Constraint),
 | 
					 | 
				
			||||||
		print(Constraint),nl, % allows use of portray to control printing
 | 
					 | 
				
			||||||
		fail
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
find_chr_constraint(Constraint) :-
 | 
					 | 
				
			||||||
	chr:'$chr_module'(Mod),
 | 
					 | 
				
			||||||
	Mod:'$enumerate_constraints'(Constraint).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
% Inlining of some goals is good for performance
 | 
					 | 
				
			||||||
% That's the reason for the next section
 | 
					 | 
				
			||||||
% There must be correspondence with the predicates as implemented in chr_mutable.pl
 | 
					 | 
				
			||||||
% so that       user:goal_expansion(G,G). also works (but do not add such a rule)
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
:- multifile user:goal_expansion/2.
 | 
					 | 
				
			||||||
:- dynamic   user:goal_expansion/2.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
user:goal_expansion('chr get_mutable'(Val,Var),    Var=mutable(Val)).
 | 
					 | 
				
			||||||
user:goal_expansion('chr update_mutable'(Val,Var), setarg(1,Var,Val)).
 | 
					 | 
				
			||||||
user:goal_expansion('chr create_mutable'(Val,Var), Var=mutable(Val)).
 | 
					 | 
				
			||||||
user:goal_expansion('chr default_store'(X),        nb_getval(chr_global,X)).
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
% goal_expansion seems too different in SICStus 4 for me to cater for in a
 | 
					 | 
				
			||||||
% decent way at this moment - so I stick with the old way to do this
 | 
					 | 
				
			||||||
% so that it doesn't get lost, the code from Mats for SICStus 4 is included in comments
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% Mats begin
 | 
					 | 
				
			||||||
%% goal_expansion('chr get_mutable'(Val,Var),    Lay, _M, get_mutable(Val,Var), Lay).
 | 
					 | 
				
			||||||
%% goal_expansion('chr update_mutable'(Val,Var), Lay, _M, update_mutable(Val,Var), Lay).
 | 
					 | 
				
			||||||
%% goal_expansion('chr create_mutable'(Val,Var), Lay, _M, create_mutable(Val,Var), Lay).
 | 
					 | 
				
			||||||
%% goal_expansion('chr default_store'(A),        Lay, _M, global_term_ref_1(A), Lay).
 | 
					 | 
				
			||||||
%% Mats begin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SICStus begin
 | 
					 | 
				
			||||||
%% :- multifile user:goal_expansion/2.
 | 
					 | 
				
			||||||
%% :- dynamic   user:goal_expansion/2.
 | 
					 | 
				
			||||||
%% 
 | 
					 | 
				
			||||||
%% user:goal_expansion('chr get_mutable'(Val,Var),    get_mutable(Val,Var)).
 | 
					 | 
				
			||||||
%% user:goal_expansion('chr update_mutable'(Val,Var), update_mutable(Val,Var)).
 | 
					 | 
				
			||||||
%% user:goal_expansion('chr create_mutable'(Val,Var), create_mutable(Val,Var)).
 | 
					 | 
				
			||||||
%% user:goal_expansion('chr default_store'(A),        global_term_ref_1(A)).
 | 
					 | 
				
			||||||
%% SICStus end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
'chr run_suspensions'( Slots) :-
 | 
					 | 
				
			||||||
	    run_suspensions( Slots).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr run_suspensions_loop'([]).
 | 
					 | 
				
			||||||
'chr run_suspensions_loop'([L|Ls]) :-
 | 
					 | 
				
			||||||
	run_suspensions(L),
 | 
					 | 
				
			||||||
	'chr run_suspensions_loop'(Ls).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
run_suspensions([]).
 | 
					 | 
				
			||||||
run_suspensions([S|Next] ) :-
 | 
					 | 
				
			||||||
	arg( 2, S, Mref), % ARGXXX
 | 
					 | 
				
			||||||
	'chr get_mutable'( Status, Mref),
 | 
					 | 
				
			||||||
	( Status==active ->
 | 
					 | 
				
			||||||
	    'chr update_mutable'( triggered, Mref),
 | 
					 | 
				
			||||||
	    arg( 4, S, Gref), % ARGXXX
 | 
					 | 
				
			||||||
	    'chr get_mutable'( Gen, Gref),
 | 
					 | 
				
			||||||
	    Generation is Gen+1,
 | 
					 | 
				
			||||||
	    'chr update_mutable'( Generation, Gref),
 | 
					 | 
				
			||||||
	    arg( 3, S, Goal), % ARGXXX
 | 
					 | 
				
			||||||
	    call( Goal),
 | 
					 | 
				
			||||||
	    'chr get_mutable'( Post, Mref),
 | 
					 | 
				
			||||||
	    ( Post==triggered ->
 | 
					 | 
				
			||||||
		'chr update_mutable'( active, Mref)	% catching constraints that did not do anything
 | 
					 | 
				
			||||||
	    ;
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	    )
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
	    true
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	run_suspensions( Next).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr run_suspensions_d'( Slots) :-
 | 
					 | 
				
			||||||
	    run_suspensions_d( Slots).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr run_suspensions_loop_d'([]).
 | 
					 | 
				
			||||||
'chr run_suspensions_loop_d'([L|Ls]) :-
 | 
					 | 
				
			||||||
	run_suspensions_d(L),
 | 
					 | 
				
			||||||
	'chr run_suspensions_loop_d'(Ls).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
run_suspensions_d([]).
 | 
					 | 
				
			||||||
run_suspensions_d([S|Next] ) :-
 | 
					 | 
				
			||||||
	arg( 2, S, Mref), % ARGXXX
 | 
					 | 
				
			||||||
	'chr get_mutable'( Status, Mref),
 | 
					 | 
				
			||||||
	( Status==active ->
 | 
					 | 
				
			||||||
	    'chr update_mutable'( triggered, Mref),
 | 
					 | 
				
			||||||
	    arg( 4, S, Gref), % ARGXXX
 | 
					 | 
				
			||||||
	    'chr get_mutable'( Gen, Gref),
 | 
					 | 
				
			||||||
	    Generation is Gen+1,
 | 
					 | 
				
			||||||
	    'chr update_mutable'( Generation, Gref),
 | 
					 | 
				
			||||||
	    arg( 3, S, Goal), % ARGXXX
 | 
					 | 
				
			||||||
	    ( 
 | 
					 | 
				
			||||||
		'chr debug_event'(wake(S)),
 | 
					 | 
				
			||||||
	        call( Goal)
 | 
					 | 
				
			||||||
	    ;
 | 
					 | 
				
			||||||
		'chr debug_event'(fail(S)), !,
 | 
					 | 
				
			||||||
		fail
 | 
					 | 
				
			||||||
	    ),
 | 
					 | 
				
			||||||
	    (
 | 
					 | 
				
			||||||
		'chr debug_event'(exit(S))
 | 
					 | 
				
			||||||
	    ;
 | 
					 | 
				
			||||||
		'chr debug_event'(redo(S)),
 | 
					 | 
				
			||||||
		fail
 | 
					 | 
				
			||||||
	    ),	
 | 
					 | 
				
			||||||
	    'chr get_mutable'( Post, Mref),
 | 
					 | 
				
			||||||
	    ( Post==triggered ->
 | 
					 | 
				
			||||||
		'chr update_mutable'( active, Mref)   % catching constraints that did not do anything
 | 
					 | 
				
			||||||
	    ;
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	    )
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
	    true
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	run_suspensions_d( Next).
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
locked:attr_unify_hook(_,_) :- fail.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
'chr lock'(T) :-
 | 
					 | 
				
			||||||
	( var(T)
 | 
					 | 
				
			||||||
	-> put_attr(T, locked, x)
 | 
					 | 
				
			||||||
        ;  term_variables(T,L),
 | 
					 | 
				
			||||||
           lockv(L)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
lockv([]).
 | 
					 | 
				
			||||||
lockv([T|R]) :- put_attr( T, locked, x), lockv(R).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr unlock'(T) :-
 | 
					 | 
				
			||||||
	( var(T)
 | 
					 | 
				
			||||||
	-> del_attr(T, locked)
 | 
					 | 
				
			||||||
	;  term_variables(T,L),
 | 
					 | 
				
			||||||
           unlockv(L)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
unlockv([]).
 | 
					 | 
				
			||||||
unlockv([T|R]) :- del_attr( T, locked), unlockv(R).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr none_locked'( []).
 | 
					 | 
				
			||||||
'chr none_locked'( [V|Vs]) :-
 | 
					 | 
				
			||||||
	( get_attr(V, locked, _) ->
 | 
					 | 
				
			||||||
		fail
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		'chr none_locked'(Vs)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr not_locked'(V) :-
 | 
					 | 
				
			||||||
	( var( V) ->
 | 
					 | 
				
			||||||
  		( get_attr( V, locked, _) ->
 | 
					 | 
				
			||||||
			fail
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			true
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
% Eager removal from all chains.
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
'chr remove_constraint_internal'( Susp, Agenda) :-
 | 
					 | 
				
			||||||
	arg( 2, Susp, Mref), % ARGXXX
 | 
					 | 
				
			||||||
	'chr get_mutable'( State, Mref), 
 | 
					 | 
				
			||||||
	'chr update_mutable'( removed, Mref),		% mark in any case
 | 
					 | 
				
			||||||
	( compound(State) ->			% passive/1
 | 
					 | 
				
			||||||
	    Agenda = []
 | 
					 | 
				
			||||||
	; State==removed ->
 | 
					 | 
				
			||||||
	    Agenda = []
 | 
					 | 
				
			||||||
	%; State==triggered ->
 | 
					 | 
				
			||||||
	%     Agenda = []
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
            Susp =.. [_,_,_,_,_,_,_|Args],
 | 
					 | 
				
			||||||
	    term_variables( Args, Vars),
 | 
					 | 
				
			||||||
	    'chr default_store'( Global),
 | 
					 | 
				
			||||||
	    Agenda = [Global|Vars]
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
'chr newvia_1'(X,V) :-
 | 
					 | 
				
			||||||
	( var(X) ->
 | 
					 | 
				
			||||||
		X = V
 | 
					 | 
				
			||||||
	; 
 | 
					 | 
				
			||||||
		nonground(X,V)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr newvia_2'(X,Y,V) :- 
 | 
					 | 
				
			||||||
	( var(X) -> 
 | 
					 | 
				
			||||||
		X = V
 | 
					 | 
				
			||||||
	; var(Y) ->
 | 
					 | 
				
			||||||
		Y = V
 | 
					 | 
				
			||||||
	; compound(X), nonground(X,V) ->
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	; 
 | 
					 | 
				
			||||||
		compound(Y), nonground(Y,V)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
% The second arg is a witness.
 | 
					 | 
				
			||||||
% The formulation with term_variables/2 is
 | 
					 | 
				
			||||||
% cycle safe, but it finds a list of all vars.
 | 
					 | 
				
			||||||
% We need only one, and no list in particular.
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
'chr newvia'(L,V) :- nonground(L,V).
 | 
					 | 
				
			||||||
%~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr via_1'(X,V) :-
 | 
					 | 
				
			||||||
	( var(X) ->
 | 
					 | 
				
			||||||
		X = V
 | 
					 | 
				
			||||||
	; atomic(X) ->
 | 
					 | 
				
			||||||
		'chr default_store'(V)
 | 
					 | 
				
			||||||
	; nonground(X,V) ->
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		'chr default_store'(V)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr via_2'(X,Y,V) :- 
 | 
					 | 
				
			||||||
	( var(X) -> 
 | 
					 | 
				
			||||||
		X = V
 | 
					 | 
				
			||||||
	; var(Y) ->
 | 
					 | 
				
			||||||
		Y = V
 | 
					 | 
				
			||||||
	; compound(X), nonground(X,V) ->
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	; compound(Y), nonground(Y,V) ->
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		'chr default_store'(V)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
% The second arg is a witness.
 | 
					 | 
				
			||||||
% The formulation with term_variables/2 is
 | 
					 | 
				
			||||||
% cycle safe, but it finds a list of all vars.
 | 
					 | 
				
			||||||
% We need only one, and no list in particular.
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
'chr via'(L,V) :-
 | 
					 | 
				
			||||||
	( nonground(L,V) ->
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		'chr default_store'(V)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
nonground( Term, V) :-
 | 
					 | 
				
			||||||
	term_variables( Term, Vs),
 | 
					 | 
				
			||||||
	Vs = [V|_].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
'chr novel_production'( Self, Tuple) :-
 | 
					 | 
				
			||||||
	arg( 5, Self, Ref), % ARGXXX
 | 
					 | 
				
			||||||
	'chr get_mutable'( History, Ref),
 | 
					 | 
				
			||||||
	( get_ds( Tuple, History, _) ->
 | 
					 | 
				
			||||||
	    fail
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
	    true
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
% Not folded with novel_production/2 because guard checking
 | 
					 | 
				
			||||||
% goes in between the two calls.
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
'chr extend_history'( Self, Tuple) :-
 | 
					 | 
				
			||||||
	arg( 5, Self, Ref), % ARGXXX
 | 
					 | 
				
			||||||
	'chr get_mutable'( History, Ref),
 | 
					 | 
				
			||||||
	put_ds( Tuple, History, x, NewHistory),
 | 
					 | 
				
			||||||
	'chr update_mutable'( NewHistory, Ref).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
constraint_generation( Susp, State, Generation) :-
 | 
					 | 
				
			||||||
	arg( 2, Susp, Mref), % ARGXXX
 | 
					 | 
				
			||||||
	'chr get_mutable'( State, Mref),
 | 
					 | 
				
			||||||
	arg( 4, Susp, Gref), % ARGXXX
 | 
					 | 
				
			||||||
	'chr get_mutable'( Generation, Gref). 	% not incremented meanwhile 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
'chr allocate_constraint'( Closure, Self, F, Args) :-
 | 
					 | 
				
			||||||
	Self =.. [suspension,Id,Mref,Closure,Gref,Href,F|Args], % SUSPXXX
 | 
					 | 
				
			||||||
	'chr create_mutable'(0, Gref),
 | 
					 | 
				
			||||||
	'chr empty_history'(History),
 | 
					 | 
				
			||||||
	'chr create_mutable'(History, Href),
 | 
					 | 
				
			||||||
	'chr create_mutable'(passive(Args), Mref),
 | 
					 | 
				
			||||||
	'chr gen_id'( Id).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
% 'chr activate_constraint'( -, +, -).
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
% The transition gc->active should be rare
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
'chr activate_constraint'( Vars, Susp, Generation) :-
 | 
					 | 
				
			||||||
	arg( 2, Susp, Mref), % ARGXXX
 | 
					 | 
				
			||||||
	'chr get_mutable'( State, Mref),
 | 
					 | 
				
			||||||
	'chr update_mutable'( active, Mref),
 | 
					 | 
				
			||||||
	( nonvar(Generation) ->			% aih
 | 
					 | 
				
			||||||
	    true
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
	    arg( 4, Susp, Gref), % ARGXXX
 | 
					 | 
				
			||||||
	    'chr get_mutable'( Gen, Gref),
 | 
					 | 
				
			||||||
	    Generation is Gen+1,
 | 
					 | 
				
			||||||
	    'chr update_mutable'( Generation, Gref)
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	( compound(State) ->			% passive/1
 | 
					 | 
				
			||||||
	    term_variables( State, Vs),
 | 
					 | 
				
			||||||
	    'chr none_locked'( Vs),
 | 
					 | 
				
			||||||
	    Vars = [Global|Vs],
 | 
					 | 
				
			||||||
	    'chr default_store'(Global)
 | 
					 | 
				
			||||||
	; State == removed ->			% the price for eager removal ...
 | 
					 | 
				
			||||||
	    Susp =.. [_,_,_,_,_,_,_|Args],
 | 
					 | 
				
			||||||
	    term_variables( Args, Vs),
 | 
					 | 
				
			||||||
	    Vars = [Global|Vs],
 | 
					 | 
				
			||||||
	    'chr default_store'(Global)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
	    Vars = []
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr insert_constraint_internal'([Global|Vars], Self, Closure, F, Args) :-
 | 
					 | 
				
			||||||
	'chr default_store'(Global),
 | 
					 | 
				
			||||||
	term_variables(Args,Vars),
 | 
					 | 
				
			||||||
	'chr none_locked'(Vars),
 | 
					 | 
				
			||||||
	Self =.. [suspension,Id,Mref,Closure,Gref,Href,F|Args], % SUSPXXX
 | 
					 | 
				
			||||||
	'chr create_mutable'(active, Mref),
 | 
					 | 
				
			||||||
	'chr create_mutable'(0, Gref),
 | 
					 | 
				
			||||||
	'chr empty_history'(History),
 | 
					 | 
				
			||||||
	'chr create_mutable'(History, Href),
 | 
					 | 
				
			||||||
	'chr gen_id'(Id).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
insert_constraint_internal([Global|Vars], Self, Term, Closure, F, Args) :-
 | 
					 | 
				
			||||||
	'chr default_store'(Global),
 | 
					 | 
				
			||||||
	term_variables( Term, Vars),
 | 
					 | 
				
			||||||
	'chr none_locked'( Vars),
 | 
					 | 
				
			||||||
	'chr empty_history'( History),
 | 
					 | 
				
			||||||
	'chr create_mutable'( active, Mref),
 | 
					 | 
				
			||||||
	'chr create_mutable'( 0, Gref),
 | 
					 | 
				
			||||||
	'chr create_mutable'( History, Href),
 | 
					 | 
				
			||||||
	'chr gen_id'( Id),
 | 
					 | 
				
			||||||
	Self =.. [suspension,Id,Mref,Closure,Gref,Href,F|Args]. % SUSPXXX
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
'chr empty_history'( E) :- empty_ds( E).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
'chr gen_id'( Id) :-
 | 
					 | 
				
			||||||
	nb_getval(chr_id,Id),
 | 
					 | 
				
			||||||
	NextId is Id + 1,
 | 
					 | 
				
			||||||
	nb_setval(chr_id,NextId).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
'chr create_mutable'(V,mutable(V)).
 | 
					 | 
				
			||||||
'chr get_mutable'(V,mutable(V)).  
 | 
					 | 
				
			||||||
'chr update_mutable'(V,M) :- setarg(1,M,V).
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SICStus begin
 | 
					 | 
				
			||||||
%% 'chr create_mutable'(Val, Mut) :- create_mutable(Val, Mut).
 | 
					 | 
				
			||||||
%% 'chr get_mutable'(Val, Mut) :- get_mutable(Val, Mut).
 | 
					 | 
				
			||||||
%% 'chr update_mutable'(Val, Mut) :- update_mutable(Val, Mut).
 | 
					 | 
				
			||||||
%% SICStus end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
'chr default_store'(X) :- nb_getval(chr_global,X).
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SICStus begin
 | 
					 | 
				
			||||||
%% 'chr default_store'(A) :- global_term_ref_1(A).
 | 
					 | 
				
			||||||
%% SICStus end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr sbag_member'( Element, [Head|Tail]) :-
 | 
					 | 
				
			||||||
      sbag_member( Element, Tail, Head).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
% auxiliary to avoid choicepoint for last element
 | 
					 | 
				
			||||||
        % does it really avoid the choicepoint? -jon
 | 
					 | 
				
			||||||
 sbag_member( E, _,	     E).
 | 
					 | 
				
			||||||
 sbag_member( E, [Head|Tail], _) :-
 | 
					 | 
				
			||||||
 	sbag_member( E, Tail, Head).
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
'chr sbag_del_element'( [],	  _,	[]).
 | 
					 | 
				
			||||||
'chr sbag_del_element'( [X|Xs], Elem, Set2) :-
 | 
					 | 
				
			||||||
	( X==Elem ->
 | 
					 | 
				
			||||||
	    Set2 = Xs
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
	    Set2 = [X|Xss],
 | 
					 | 
				
			||||||
	    'chr sbag_del_element'( Xs, Elem, Xss)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
'chr merge_attributes'([],Ys,Ys).
 | 
					 | 
				
			||||||
'chr merge_attributes'([X | Xs],YL,R) :-
 | 
					 | 
				
			||||||
  ( YL = [Y | Ys] ->
 | 
					 | 
				
			||||||
      arg(1,X,XId), % ARGXXX
 | 
					 | 
				
			||||||
      arg(1,Y,YId),	 % ARGXXX
 | 
					 | 
				
			||||||
       ( XId < YId ->
 | 
					 | 
				
			||||||
           R = [X | T],
 | 
					 | 
				
			||||||
           'chr merge_attributes'(Xs,YL,T)
 | 
					 | 
				
			||||||
       ; XId > YId ->
 | 
					 | 
				
			||||||
           R = [Y | T],
 | 
					 | 
				
			||||||
           'chr merge_attributes'([X|Xs],Ys,T)
 | 
					 | 
				
			||||||
       ;
 | 
					 | 
				
			||||||
           R = [X | T],
 | 
					 | 
				
			||||||
           'chr merge_attributes'(Xs,Ys,T)
 | 
					 | 
				
			||||||
       )    
 | 
					 | 
				
			||||||
  ;
 | 
					 | 
				
			||||||
       R = [X | Xs]
 | 
					 | 
				
			||||||
  ).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr new_merge_attributes'([],A2,A) :-
 | 
					 | 
				
			||||||
	A = A2.
 | 
					 | 
				
			||||||
'chr new_merge_attributes'([E1|AT1],A2,A) :-
 | 
					 | 
				
			||||||
	( A2 = [E2|AT2] ->
 | 
					 | 
				
			||||||
		'chr new_merge_attributes'(E1,E2,AT1,AT2,A)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		A = [E1|AT1]
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
'chr new_merge_attributes'(Pos1-L1,Pos2-L2,AT1,AT2,A) :-
 | 
					 | 
				
			||||||
	( Pos1 < Pos2 ->
 | 
					 | 
				
			||||||
		A = [Pos1-L1|AT],
 | 
					 | 
				
			||||||
		'chr new_merge_attributes'(AT1,[Pos2-L2|AT2],AT)
 | 
					 | 
				
			||||||
	; Pos1 > Pos2 ->
 | 
					 | 
				
			||||||
		A = [Pos2-L2|AT],
 | 
					 | 
				
			||||||
		'chr new_merge_attributes'([Pos1-L1|AT1],AT2,AT)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		'chr merge_attributes'(L1,L2,L),
 | 
					 | 
				
			||||||
		A = [Pos1-L|AT],
 | 
					 | 
				
			||||||
		'chr new_merge_attributes'(AT1,AT2,AT)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr all_suspensions'([],_,_).
 | 
					 | 
				
			||||||
'chr all_suspensions'([Susps|SuspsList],Pos,Attr) :-
 | 
					 | 
				
			||||||
	all_suspensions(Attr,Susps,SuspsList,Pos).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
all_suspensions([],[],SuspsList,Pos) :-
 | 
					 | 
				
			||||||
	all_suspensions([],[],SuspsList,Pos). % all empty lists
 | 
					 | 
				
			||||||
all_suspensions([APos-ASusps|RAttr],Susps,SuspsList,Pos) :-
 | 
					 | 
				
			||||||
	NPos is Pos + 1,
 | 
					 | 
				
			||||||
	( Pos == APos ->
 | 
					 | 
				
			||||||
		Susps = ASusps,
 | 
					 | 
				
			||||||
		'chr all_suspensions'(SuspsList,NPos,RAttr)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		Susps = [],
 | 
					 | 
				
			||||||
		'chr all_suspensions'(SuspsList,NPos,[APos-ASusps|RAttr])
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr normalize_attr'([],[]).
 | 
					 | 
				
			||||||
'chr normalize_attr'([Pos-L|R],[Pos-NL|NR]) :-
 | 
					 | 
				
			||||||
	sort(L,NL),
 | 
					 | 
				
			||||||
	'chr normalize_attr'(R,NR).			
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr select'([E|T],F,R) :-
 | 
					 | 
				
			||||||
	( E = F ->
 | 
					 | 
				
			||||||
		R = T
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		R = [E|NR],
 | 
					 | 
				
			||||||
		'chr select'(T,F,NR)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- multifile
 | 
					 | 
				
			||||||
	chr:debug_event/2,		% +State, +Event
 | 
					 | 
				
			||||||
	chr:debug_interact/3.		% +Event, +Depth, -Command
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr debug_event'(Event) :-
 | 
					 | 
				
			||||||
	nb_getval(chr_debug,mutable(State)),  % XXX
 | 
					 | 
				
			||||||
	( State == off ->
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	; chr:debug_event(State, Event) ->
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	; 	debug_event(State,Event)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_trace :-
 | 
					 | 
				
			||||||
	nb_setval(chr_debug,mutable(trace)).
 | 
					 | 
				
			||||||
chr_notrace :-
 | 
					 | 
				
			||||||
	nb_setval(chr_debug,mutable(off)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	chr_leash(+Spec)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Define the set of ports at which we prompt for user interaction
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_leash(Spec) :-
 | 
					 | 
				
			||||||
	leashed_ports(Spec, Ports),
 | 
					 | 
				
			||||||
	nb_setval(chr_leash,mutable(Ports)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
leashed_ports(none, []).
 | 
					 | 
				
			||||||
leashed_ports(off,  []).
 | 
					 | 
				
			||||||
leashed_ports(all,  [call, exit, redo, fail, wake, try, apply, insert, remove]).
 | 
					 | 
				
			||||||
leashed_ports(default, [call,exit,fail,wake,apply]).
 | 
					 | 
				
			||||||
leashed_ports(One, Ports) :-
 | 
					 | 
				
			||||||
	atom(One), One \== [], !,
 | 
					 | 
				
			||||||
	leashed_ports([One], Ports).
 | 
					 | 
				
			||||||
leashed_ports(Set, Ports) :-
 | 
					 | 
				
			||||||
	sort(Set, Ports),		% make unique
 | 
					 | 
				
			||||||
	leashed_ports(all, All),
 | 
					 | 
				
			||||||
	valid_ports(Ports, All).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
valid_ports([], _).
 | 
					 | 
				
			||||||
valid_ports([H|T], Valid) :-
 | 
					 | 
				
			||||||
	(   memberchk(H, Valid)
 | 
					 | 
				
			||||||
	->  true
 | 
					 | 
				
			||||||
	;   throw(error(domain_error(chr_port, H), _))
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	valid_ports(T, Valid).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
user:exception(undefined_global_variable, Name, retry) :-
 | 
					 | 
				
			||||||
	chr_runtime_debug_global_variable(Name),
 | 
					 | 
				
			||||||
	chr_debug_init.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_runtime_debug_global_variable(chr_leash).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_debug_init :-
 | 
					 | 
				
			||||||
   leashed_ports(default, Ports),
 | 
					 | 
				
			||||||
   nb_setval(chr_leash, mutable(Ports)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- initialization chr_debug_init.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	debug_event(+State, +Event)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%debug_event(trace, Event) :-
 | 
					 | 
				
			||||||
%	functor(Event, Name, Arity),
 | 
					 | 
				
			||||||
%	writeln(Name/Arity), fail.
 | 
					 | 
				
			||||||
debug_event(trace,Event) :- 
 | 
					 | 
				
			||||||
	Event = call(_), !,
 | 
					 | 
				
			||||||
	get_debug_history(History,Depth),
 | 
					 | 
				
			||||||
	NDepth is Depth + 1,
 | 
					 | 
				
			||||||
	chr_debug_interact(Event,NDepth), 
 | 
					 | 
				
			||||||
	set_debug_history([Event|History],NDepth).
 | 
					 | 
				
			||||||
debug_event(trace,Event) :- 
 | 
					 | 
				
			||||||
	Event = wake(_), !,
 | 
					 | 
				
			||||||
	get_debug_history(History,Depth),
 | 
					 | 
				
			||||||
	NDepth is Depth + 1,
 | 
					 | 
				
			||||||
	chr_debug_interact(Event,NDepth), 
 | 
					 | 
				
			||||||
	set_debug_history([Event|History],NDepth).
 | 
					 | 
				
			||||||
debug_event(trace,Event) :-
 | 
					 | 
				
			||||||
	Event = redo(_), !,
 | 
					 | 
				
			||||||
	get_debug_history(_History, Depth),
 | 
					 | 
				
			||||||
	chr_debug_interact(Event, Depth).
 | 
					 | 
				
			||||||
debug_event(trace,Event) :- 
 | 
					 | 
				
			||||||
	Event = exit(_),!,
 | 
					 | 
				
			||||||
	get_debug_history([_|History],Depth),
 | 
					 | 
				
			||||||
	chr_debug_interact(Event,Depth),
 | 
					 | 
				
			||||||
	NDepth is Depth - 1,
 | 
					 | 
				
			||||||
	set_debug_history(History,NDepth). 
 | 
					 | 
				
			||||||
debug_event(trace,Event) :- 
 | 
					 | 
				
			||||||
	Event = fail(_),!,
 | 
					 | 
				
			||||||
	get_debug_history(_,Depth),
 | 
					 | 
				
			||||||
	chr_debug_interact(Event,Depth). 
 | 
					 | 
				
			||||||
debug_event(trace, Event) :-
 | 
					 | 
				
			||||||
	Event = remove(_), !,
 | 
					 | 
				
			||||||
	get_debug_history(_,Depth),
 | 
					 | 
				
			||||||
	chr_debug_interact(Event, Depth).
 | 
					 | 
				
			||||||
debug_event(trace, Event) :-
 | 
					 | 
				
			||||||
	Event = insert(_), !,
 | 
					 | 
				
			||||||
	get_debug_history(_,Depth),
 | 
					 | 
				
			||||||
	chr_debug_interact(Event, Depth).
 | 
					 | 
				
			||||||
debug_event(trace, Event) :-
 | 
					 | 
				
			||||||
	Event = try(_,_,_,_), !,
 | 
					 | 
				
			||||||
	get_debug_history(_,Depth),
 | 
					 | 
				
			||||||
	chr_debug_interact(Event, Depth).
 | 
					 | 
				
			||||||
debug_event(trace, Event) :- 
 | 
					 | 
				
			||||||
	Event = apply(_,_,_,_), !,
 | 
					 | 
				
			||||||
	get_debug_history(_,Depth),
 | 
					 | 
				
			||||||
	chr_debug_interact(Event,Depth). 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
debug_event(skip(_,_),Event) :- 
 | 
					 | 
				
			||||||
	Event = call(_), !,
 | 
					 | 
				
			||||||
	get_debug_history(History,Depth),
 | 
					 | 
				
			||||||
	NDepth is Depth + 1,
 | 
					 | 
				
			||||||
	set_debug_history([Event|History],NDepth).
 | 
					 | 
				
			||||||
debug_event(skip(_,_),Event) :- 
 | 
					 | 
				
			||||||
	Event = wake(_), !,
 | 
					 | 
				
			||||||
	get_debug_history(History,Depth),
 | 
					 | 
				
			||||||
	NDepth is Depth + 1,
 | 
					 | 
				
			||||||
	set_debug_history([Event|History],NDepth).
 | 
					 | 
				
			||||||
debug_event(skip(SkipSusp,SkipDepth),Event) :- 
 | 
					 | 
				
			||||||
	Event = exit(Susp),!,
 | 
					 | 
				
			||||||
	get_debug_history([_|History],Depth),
 | 
					 | 
				
			||||||
	( SkipDepth == Depth,
 | 
					 | 
				
			||||||
	  SkipSusp == Susp -> 
 | 
					 | 
				
			||||||
		set_chr_debug(trace),
 | 
					 | 
				
			||||||
		chr_debug_interact(Event,Depth)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	NDepth is Depth - 1,
 | 
					 | 
				
			||||||
	set_debug_history(History,NDepth). 
 | 
					 | 
				
			||||||
debug_event(skip(_,_),_) :- !,
 | 
					 | 
				
			||||||
	true.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	chr_debug_interact(+Event, +Depth)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Interact with the user on Event that took place at Depth.  First
 | 
					 | 
				
			||||||
%	calls chr:debug_interact(+Event, +Depth, -Command) hook. If this
 | 
					 | 
				
			||||||
%	fails the event is printed and the system prompts for a command.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_debug_interact(Event, Depth) :-
 | 
					 | 
				
			||||||
	chr:debug_interact(Event, Depth, Command), !,
 | 
					 | 
				
			||||||
	handle_debug_command(Command,Event,Depth).
 | 
					 | 
				
			||||||
chr_debug_interact(Event, Depth) :-
 | 
					 | 
				
			||||||
	print_event(Event, Depth),
 | 
					 | 
				
			||||||
	(   leashed(Event)
 | 
					 | 
				
			||||||
	->  ask_continue(Command)
 | 
					 | 
				
			||||||
	;   Command = creep
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	handle_debug_command(Command,Event,Depth).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
leashed(Event) :-
 | 
					 | 
				
			||||||
	functor(Event, Port, _),
 | 
					 | 
				
			||||||
	nb_getval(chr_leash, mutable(Ports)),
 | 
					 | 
				
			||||||
	memberchk(Port, Ports).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ask_continue(Command) :-
 | 
					 | 
				
			||||||
	print_message(debug, chr(prompt)),
 | 
					 | 
				
			||||||
	get_single_char(CharCode),
 | 
					 | 
				
			||||||
	(   CharCode == -1
 | 
					 | 
				
			||||||
	->  Char = end_of_file
 | 
					 | 
				
			||||||
	;   char_code(Char, CharCode)
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	(   debug_command(Char, Command)
 | 
					 | 
				
			||||||
	->  print_message(debug, chr(command(Command)))
 | 
					 | 
				
			||||||
	;   print_message(help, chr(invalid_command)),
 | 
					 | 
				
			||||||
	    ask_continue(Command)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr debug command'(Char, Command) :-
 | 
					 | 
				
			||||||
	debug_command(Char, Command).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
debug_command(c, creep).
 | 
					 | 
				
			||||||
debug_command(' ', creep).
 | 
					 | 
				
			||||||
debug_command('\r', creep).
 | 
					 | 
				
			||||||
debug_command(s, skip).
 | 
					 | 
				
			||||||
debug_command(g, ancestors).
 | 
					 | 
				
			||||||
debug_command(n, nodebug).
 | 
					 | 
				
			||||||
debug_command(a, abort).
 | 
					 | 
				
			||||||
debug_command(f, fail).
 | 
					 | 
				
			||||||
debug_command(b, break).
 | 
					 | 
				
			||||||
debug_command(?, help).
 | 
					 | 
				
			||||||
debug_command(h, help).
 | 
					 | 
				
			||||||
debug_command(end_of_file, exit).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
handle_debug_command(creep,_,_) :- !.
 | 
					 | 
				
			||||||
handle_debug_command(skip, Event, Depth) :- !,
 | 
					 | 
				
			||||||
	Event =.. [Type|Rest],
 | 
					 | 
				
			||||||
	( Type \== call,
 | 
					 | 
				
			||||||
	  Type \== wake ->
 | 
					 | 
				
			||||||
		handle_debug_command('c',Event,Depth)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		Rest = [Susp],
 | 
					 | 
				
			||||||
		set_chr_debug(skip(Susp,Depth))
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
handle_debug_command(ancestors,Event,Depth) :- !,
 | 
					 | 
				
			||||||
	print_chr_debug_history,
 | 
					 | 
				
			||||||
	chr_debug_interact(Event,Depth).	
 | 
					 | 
				
			||||||
handle_debug_command(nodebug,_,_) :- !,
 | 
					 | 
				
			||||||
	chr_notrace.
 | 
					 | 
				
			||||||
handle_debug_command(abort,_,_) :- !,
 | 
					 | 
				
			||||||
	abort.
 | 
					 | 
				
			||||||
handle_debug_command(exit,_,_) :- !,
 | 
					 | 
				
			||||||
	halt.
 | 
					 | 
				
			||||||
handle_debug_command(fail,_,_) :- !,
 | 
					 | 
				
			||||||
	fail.
 | 
					 | 
				
			||||||
handle_debug_command(break,Event,Depth) :- !,
 | 
					 | 
				
			||||||
	break,
 | 
					 | 
				
			||||||
	chr_debug_interact(Event,Depth).
 | 
					 | 
				
			||||||
handle_debug_command(help,Event,Depth) :- !,
 | 
					 | 
				
			||||||
	print_message(help, chr(debug_options)),
 | 
					 | 
				
			||||||
	chr_debug_interact(Event,Depth).	
 | 
					 | 
				
			||||||
handle_debug_command(Cmd, _, _) :- 
 | 
					 | 
				
			||||||
	throw(error(domain_error(chr_debug_command, Cmd), _)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
print_chr_debug_history :-
 | 
					 | 
				
			||||||
	get_debug_history(History,Depth),
 | 
					 | 
				
			||||||
	print_message(debug, chr(ancestors(History, Depth))).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
print_event(Event, Depth) :-
 | 
					 | 
				
			||||||
	print_message(debug, chr(event(Event, Depth))).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	{set,get}_debug_history(Ancestors, Depth)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Set/get the list of ancestors and the depth of the current goal.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
get_debug_history(History,Depth) :-
 | 
					 | 
				
			||||||
	nb_getval(chr_debug_history,mutable(History,Depth)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set_debug_history(History,Depth) :-
 | 
					 | 
				
			||||||
	nb_getval(chr_debug_history,Mutable),
 | 
					 | 
				
			||||||
	setarg(1,Mutable,History),
 | 
					 | 
				
			||||||
	setarg(2,Mutable,Depth).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set_chr_debug(State) :-
 | 
					 | 
				
			||||||
	nb_getval(chr_debug,Mutable),
 | 
					 | 
				
			||||||
	setarg(1,Mutable,State).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'chr chr_indexed_variables'(Susp,Vars) :-
 | 
					 | 
				
			||||||
        Susp =.. [_,_,_,_,_,_,_|Args],
 | 
					 | 
				
			||||||
	term_variables(Args,Vars).
 | 
					 | 
				
			||||||
@@ -1,438 +0,0 @@
 | 
				
			|||||||
/*  $Id: chr_swi.pl,v 1.6 2008-03-31 22:56:21 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Author:        Tom Schrijvers and Jan Wielemaker
 | 
					 | 
				
			||||||
    E-mail:        Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2003-2004, K.U. Leuven
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
:- module(chr,
 | 
					 | 
				
			||||||
	  [ op(1180, xfx, ==>),
 | 
					 | 
				
			||||||
	    op(1180, xfx, <=>),
 | 
					 | 
				
			||||||
	    op(1150, fx, constraints),
 | 
					 | 
				
			||||||
	    op(1150, fx, chr_constraint),
 | 
					 | 
				
			||||||
	    op(1150, fx, chr_preprocessor),
 | 
					 | 
				
			||||||
	    op(1150, fx, handler),
 | 
					 | 
				
			||||||
	    op(1150, fx, rules),
 | 
					 | 
				
			||||||
	    op(1100, xfx, \),
 | 
					 | 
				
			||||||
	    op(1200, xfx, @),
 | 
					 | 
				
			||||||
	    op(1190, xfx, pragma),
 | 
					 | 
				
			||||||
	    op( 500, yfx, #),
 | 
					 | 
				
			||||||
	    op(1150, fx, chr_type),
 | 
					 | 
				
			||||||
	    op(1150, fx, chr_declaration),
 | 
					 | 
				
			||||||
	    op(1130, xfx, --->),
 | 
					 | 
				
			||||||
	    op(1150, fx, (?)),
 | 
					 | 
				
			||||||
	    chr_show_store/1,		% +Module
 | 
					 | 
				
			||||||
	    find_chr_constraint/1,	% +Pattern
 | 
					 | 
				
			||||||
	    chr_trace/0,
 | 
					 | 
				
			||||||
	    chr_notrace/0,
 | 
					 | 
				
			||||||
	    chr_leash/1			% +Ports
 | 
					 | 
				
			||||||
	  ]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- expects_dialect(swi).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- if(current_prolog_flag(dialect, yap)).
 | 
					 | 
				
			||||||
:- hide(atomic_concat).
 | 
					 | 
				
			||||||
:- endif.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- set_prolog_flag(generate_debug_info, false).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- multifile user:file_search_path/2.
 | 
					 | 
				
			||||||
:- dynamic   user:file_search_path/2.
 | 
					 | 
				
			||||||
:- dynamic   chr_translated_program/1.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
user:file_search_path(chr, library(chr)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- load_files([ chr(chr_translate),
 | 
					 | 
				
			||||||
		chr(chr_runtime),
 | 
					 | 
				
			||||||
		chr(chr_messages),
 | 
					 | 
				
			||||||
		chr(chr_hashtable_store),
 | 
					 | 
				
			||||||
		chr(chr_compiler_errors)
 | 
					 | 
				
			||||||
	      ],
 | 
					 | 
				
			||||||
	      [ if(not_loaded),
 | 
					 | 
				
			||||||
		silent(true)
 | 
					 | 
				
			||||||
	      ]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- use_module(library(lists),[member/2]).
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SICStus begin
 | 
					 | 
				
			||||||
%% :- module(chr,[
 | 
					 | 
				
			||||||
%%	chr_trace/0,
 | 
					 | 
				
			||||||
%%	chr_notrace/0,
 | 
					 | 
				
			||||||
%%	chr_leash/0,
 | 
					 | 
				
			||||||
%%	chr_flag/3,
 | 
					 | 
				
			||||||
%%	chr_show_store/1
 | 
					 | 
				
			||||||
%%	]).
 | 
					 | 
				
			||||||
%% 
 | 
					 | 
				
			||||||
%% :- op(1180, xfx, ==>),
 | 
					 | 
				
			||||||
%% 	op(1180, xfx, <=>),
 | 
					 | 
				
			||||||
%% 	op(1150, fx, constraints),
 | 
					 | 
				
			||||||
%% 	op(1150, fx, handler),
 | 
					 | 
				
			||||||
%% 	op(1150, fx, rules),
 | 
					 | 
				
			||||||
%% 	op(1100, xfx, \),
 | 
					 | 
				
			||||||
%% 	op(1200, xfx, @),
 | 
					 | 
				
			||||||
%% 	op(1190, xfx, pragma),
 | 
					 | 
				
			||||||
%% 	op( 500, yfx, #),
 | 
					 | 
				
			||||||
%% 	op(1150, fx, chr_type),
 | 
					 | 
				
			||||||
%% 	op(1130, xfx, --->),
 | 
					 | 
				
			||||||
%% 	op(1150, fx, (?)).
 | 
					 | 
				
			||||||
%% 
 | 
					 | 
				
			||||||
%% :- multifile user:file_search_path/2.
 | 
					 | 
				
			||||||
%% :- dynamic   chr_translated_program/1.
 | 
					 | 
				
			||||||
%% 
 | 
					 | 
				
			||||||
%% user:file_search_path(chr, library(chr)).
 | 
					 | 
				
			||||||
%% 
 | 
					 | 
				
			||||||
%% 
 | 
					 | 
				
			||||||
%% :- use_module('chr/chr_translate').
 | 
					 | 
				
			||||||
%% :- use_module('chr/chr_runtime').
 | 
					 | 
				
			||||||
%% :- use_module('chr/chr_hashtable_store').
 | 
					 | 
				
			||||||
%% :- use_module('chr/hprolog').
 | 
					 | 
				
			||||||
%% SICStus end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- multifile chr:'$chr_module'/1.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- dynamic chr_term/3.			% File, Term
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- dynamic chr_pp/2.		% File, Term
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	chr_expandable(+Term)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Succeeds if Term is a  rule  that   must  be  handled by the CHR
 | 
					 | 
				
			||||||
%	compiler. Ideally CHR definitions should be between
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
%		:- constraints ...
 | 
					 | 
				
			||||||
%		...
 | 
					 | 
				
			||||||
%		:- end_constraints.
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
%	As they are not we have to   use  some heuristics. We assume any
 | 
					 | 
				
			||||||
%	file is a CHR after we've seen :- constraints ... 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_expandable((:- constraints _)).
 | 
					 | 
				
			||||||
chr_expandable((constraints _)).
 | 
					 | 
				
			||||||
chr_expandable((:- chr_constraint _)).
 | 
					 | 
				
			||||||
chr_expandable((:- chr_type _)).
 | 
					 | 
				
			||||||
chr_expandable((chr_type _)).
 | 
					 | 
				
			||||||
chr_expandable((:- chr_declaration _)).
 | 
					 | 
				
			||||||
chr_expandable(option(_, _)).
 | 
					 | 
				
			||||||
chr_expandable((:- chr_option(_, _))).
 | 
					 | 
				
			||||||
chr_expandable((handler _)).
 | 
					 | 
				
			||||||
chr_expandable((rules _)).
 | 
					 | 
				
			||||||
chr_expandable((_ <=> _)).
 | 
					 | 
				
			||||||
chr_expandable((_ @ _)).
 | 
					 | 
				
			||||||
chr_expandable((_ ==> _)).
 | 
					 | 
				
			||||||
chr_expandable((_ pragma _)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	chr_expand(+Term, -Expansion)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Extract CHR declarations and rules from the file and run the
 | 
					 | 
				
			||||||
%	CHR compiler when reaching end-of-file.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
extra_declarations([(:- use_module(chr(chr_runtime)))
 | 
					 | 
				
			||||||
		   ,(:- style_check(-discontiguous)) % no need to restore; file ends
 | 
					 | 
				
			||||||
		   ,(:- set_prolog_flag(generate_debug_info, false))
 | 
					 | 
				
			||||||
		   | Tail], Tail).
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SICStus begin
 | 
					 | 
				
			||||||
%% extra_declarations([(:-use_module(chr(chr_runtime)))
 | 
					 | 
				
			||||||
%% 		     , (:- use_module(chr(hprolog),[term_variables/2,term_variables/3]))
 | 
					 | 
				
			||||||
%% 		     , (:-use_module(chr(hpattvars)))
 | 
					 | 
				
			||||||
%% 		     | Tail], Tail).		   
 | 
					 | 
				
			||||||
%% SICStus end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_expand(Term, []) :-
 | 
					 | 
				
			||||||
	chr_expandable(Term), !,
 | 
					 | 
				
			||||||
	prolog_load_context(file,File),
 | 
					 | 
				
			||||||
	prolog_load_context(term_position,'$stream_position'(_, LineNumber, _, _, _)),
 | 
					 | 
				
			||||||
	add_pragma_to_chr_rule(Term,line_number(LineNumber),NTerm),
 | 
					 | 
				
			||||||
	assert(chr_term(File, LineNumber, NTerm)).
 | 
					 | 
				
			||||||
chr_expand(Term, []) :-
 | 
					 | 
				
			||||||
	Term = ((:- chr_preprocessor Preprocessor)), !,
 | 
					 | 
				
			||||||
	prolog_load_context(file,File),
 | 
					 | 
				
			||||||
	assert(chr_pp(File, Preprocessor)).
 | 
					 | 
				
			||||||
chr_expand(end_of_file, FinalProgram) :-
 | 
					 | 
				
			||||||
	extra_declarations(FinalProgram,Program),
 | 
					 | 
				
			||||||
	prolog_load_context(file,File),
 | 
					 | 
				
			||||||
	findall(T, retract(chr_term(File,_Line,T)), CHR0),
 | 
					 | 
				
			||||||
	CHR0 \== [],
 | 
					 | 
				
			||||||
	prolog_load_context(module, Module),
 | 
					 | 
				
			||||||
	add_debug_decl(CHR0, CHR1),
 | 
					 | 
				
			||||||
	add_optimise_decl(CHR1, CHR2),
 | 
					 | 
				
			||||||
	CHR3 = [ (:- module(Module, [])) | CHR2 ],
 | 
					 | 
				
			||||||
	findall(P, retract(chr_pp(File, P)), Preprocessors),
 | 
					 | 
				
			||||||
	( Preprocessors = [] ->
 | 
					 | 
				
			||||||
		CHR3 = CHR
 | 
					 | 
				
			||||||
	; Preprocessors = [Preprocessor] ->
 | 
					 | 
				
			||||||
		chr_compiler_errors:chr_info(preprocessor,'\tPreprocessing with ~w.\n',[Preprocessor]),
 | 
					 | 
				
			||||||
		call_chr_preprocessor(Preprocessor,CHR3,CHR)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		chr_compiler_errors:print_chr_error(error(syntax(Preprocessors),'Too many preprocessors! Only one is allowed!\n',[])),
 | 
					 | 
				
			||||||
		fail
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	catch(call_chr_translate(File,
 | 
					 | 
				
			||||||
			   [ (:- module(Module, []))
 | 
					 | 
				
			||||||
			   | CHR
 | 
					 | 
				
			||||||
			   ],
 | 
					 | 
				
			||||||
			   Program0),
 | 
					 | 
				
			||||||
		chr_error(Error),
 | 
					 | 
				
			||||||
		(	chr_compiler_errors:print_chr_error(Error),
 | 
					 | 
				
			||||||
			fail
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	delete_header(Program0, Program).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
delete_header([(:- module(_,_))|T0], T) :- !,
 | 
					 | 
				
			||||||
	delete_header(T0, T).
 | 
					 | 
				
			||||||
delete_header(L, L).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
add_debug_decl(CHR, CHR) :-
 | 
					 | 
				
			||||||
	member(option(Name, _), CHR), Name == debug, !.
 | 
					 | 
				
			||||||
add_debug_decl(CHR, CHR) :-
 | 
					 | 
				
			||||||
	member((:- chr_option(Name, _)), CHR), Name == debug, !.
 | 
					 | 
				
			||||||
add_debug_decl(CHR, [(:- chr_option(debug, Debug))|CHR]) :-
 | 
					 | 
				
			||||||
	(   chr_current_prolog_flag(generate_debug_info, true)
 | 
					 | 
				
			||||||
	->  Debug = on
 | 
					 | 
				
			||||||
	;   Debug = off
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
chr_current_prolog_flag(Flag,Val) :- current_prolog_flag(Flag,Val).
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
add_optimise_decl(CHR, CHR) :-
 | 
					 | 
				
			||||||
	\+(\+(memberchk((:- chr_option(optimize, _)), CHR))), !.
 | 
					 | 
				
			||||||
add_optimise_decl(CHR, [(:- chr_option(optimize, full))|CHR]) :-
 | 
					 | 
				
			||||||
	chr_current_prolog_flag(optimize, full), !.
 | 
					 | 
				
			||||||
add_optimise_decl(CHR, CHR).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	call_chr_translate(+File, +In, -Out)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	The entire chr_translate/2 translation may fail, in which case we'd
 | 
					 | 
				
			||||||
%	better issue a warning  rather  than   simply  ignoring  the CHR
 | 
					 | 
				
			||||||
%	declarations.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
call_chr_translate(File, In, _Out) :-
 | 
					 | 
				
			||||||
	( chr_translate_line_info(In, File, Out0) ->
 | 
					 | 
				
			||||||
	    nb_setval(chr_translated_program,Out0),
 | 
					 | 
				
			||||||
	    fail
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
call_chr_translate(_, _In, Out) :-
 | 
					 | 
				
			||||||
	nb_current(chr_translated_program,Out), !,
 | 
					 | 
				
			||||||
	nb_delete(chr_translated_program).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
call_chr_translate(File, _, []) :-
 | 
					 | 
				
			||||||
	print_message(error, chr(compilation_failed(File))).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
call_chr_preprocessor(Preprocessor,CHR,_NCHR) :-
 | 
					 | 
				
			||||||
	( call(Preprocessor,CHR,CHR0) ->
 | 
					 | 
				
			||||||
		nb_setval(chr_preprocessed_program,CHR0),
 | 
					 | 
				
			||||||
		fail
 | 
					 | 
				
			||||||
 	).
 | 
					 | 
				
			||||||
call_chr_preprocessor(_,_,NCHR)	:-
 | 
					 | 
				
			||||||
	nb_current(chr_preprocessed_program,NCHR), !,
 | 
					 | 
				
			||||||
	nb_delete(chr_preprocessed_program).
 | 
					 | 
				
			||||||
call_chr_preprocessor(Preprocessor,_,_) :-
 | 
					 | 
				
			||||||
	chr_compiler_errors:print_chr_error(error(preprocessor,'Preprocessor `~w\' failed!\n',[Preprocessor])).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		 /*******************************
 | 
					 | 
				
			||||||
		 *      SYNCHRONISE TRACER	*
 | 
					 | 
				
			||||||
		 *******************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- multifile
 | 
					 | 
				
			||||||
	user:message_hook/3,
 | 
					 | 
				
			||||||
	chr:debug_event/2,
 | 
					 | 
				
			||||||
	chr:debug_interact/3.
 | 
					 | 
				
			||||||
:- dynamic
 | 
					 | 
				
			||||||
	user:message_hook/3.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
user:message_hook(trace_mode(OnOff), _, _) :-
 | 
					 | 
				
			||||||
	(   OnOff == on
 | 
					 | 
				
			||||||
	->  chr_trace
 | 
					 | 
				
			||||||
	;   chr_notrace
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	fail.				% backtrack to other handlers
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	chr:debug_event(+State, +Event)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Hook into the CHR debugger.  At this moment we will discard CHR
 | 
					 | 
				
			||||||
%	events if we are in a Prolog `skip' and we ignore the 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr:debug_event(_State, _Event) :-
 | 
					 | 
				
			||||||
	tracing,			% are we tracing?
 | 
					 | 
				
			||||||
	prolog_skip_level(Skip, Skip),
 | 
					 | 
				
			||||||
	Skip \== very_deep,
 | 
					 | 
				
			||||||
	prolog_current_frame(Me),
 | 
					 | 
				
			||||||
	prolog_frame_attribute(Me, level, Level),
 | 
					 | 
				
			||||||
	Level > Skip, !.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	chr:debug_interact(+Event, +Depth, -Command)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Hook into the CHR debugger to display Event and ask for the next
 | 
					 | 
				
			||||||
%	command to execute. This  definition   causes  the normal Prolog
 | 
					 | 
				
			||||||
%	debugger to be used for the standard ports.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr:debug_interact(Event, _Depth, creep) :-
 | 
					 | 
				
			||||||
	prolog_event(Event),
 | 
					 | 
				
			||||||
	tracing, !.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
prolog_event(call(_)).
 | 
					 | 
				
			||||||
prolog_event(exit(_)).
 | 
					 | 
				
			||||||
prolog_event(fail(_)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		 /*******************************
 | 
					 | 
				
			||||||
		 *	      MESSAGES		*
 | 
					 | 
				
			||||||
		 *******************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- multifile
 | 
					 | 
				
			||||||
	prolog:message/3.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
prolog:message(chr(CHR)) -->
 | 
					 | 
				
			||||||
	chr_message(CHR).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		 /*******************************
 | 
					 | 
				
			||||||
		 *	 TOPLEVEL PRINTING	*	
 | 
					 | 
				
			||||||
		 *******************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- set_prolog_flag(chr_toplevel_show_store,true).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
prolog:message(query(YesNo)) --> !,
 | 
					 | 
				
			||||||
	['~@'-[chr:print_all_stores]],
 | 
					 | 
				
			||||||
        '$messages':prolog_message(query(YesNo)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
prolog:message(query(YesNo,Bindings)) --> !,
 | 
					 | 
				
			||||||
	['~@'-[chr:print_all_stores]],
 | 
					 | 
				
			||||||
        '$messages':prolog_message(query(YesNo,Bindings)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
print_all_stores :-
 | 
					 | 
				
			||||||
	( chr_current_prolog_flag(chr_toplevel_show_store,true),
 | 
					 | 
				
			||||||
	  catch(nb_getval(chr_global, _), _, fail),
 | 
					 | 
				
			||||||
	  chr:'$chr_module'(Mod),
 | 
					 | 
				
			||||||
	  chr_show_store(Mod),
 | 
					 | 
				
			||||||
	  fail
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
	  true
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		 /*******************************
 | 
					 | 
				
			||||||
		 *	   MUST BE LAST!	*
 | 
					 | 
				
			||||||
		 *******************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- multifile user:term_expansion/2.
 | 
					 | 
				
			||||||
:- dynamic   user:term_expansion/2.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
user:term_expansion(In, Out) :-
 | 
					 | 
				
			||||||
	chr_expand(In, Out).
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SICStus begin
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
% :- dynamic
 | 
					 | 
				
			||||||
% 	current_toplevel_show_store/1,
 | 
					 | 
				
			||||||
% 	current_generate_debug_info/1,
 | 
					 | 
				
			||||||
% 	current_optimize/1.
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
% current_toplevel_show_store(on).
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
% current_generate_debug_info(false).
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
% current_optimize(off).
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
% chr_current_prolog_flag(generate_debug_info, X) :-
 | 
					 | 
				
			||||||
% 	chr_flag(generate_debug_info, X, X).
 | 
					 | 
				
			||||||
% chr_current_prolog_flag(optimize, X) :-
 | 
					 | 
				
			||||||
% 	chr_flag(optimize, X, X).
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
% chr_flag(Flag, Old, New) :-
 | 
					 | 
				
			||||||
% 	Goal = chr_flag(Flag,Old,New),
 | 
					 | 
				
			||||||
% 	g must_be(Flag, oneof([toplevel_show_store,generate_debug_info,optimize]), Goal, 1),
 | 
					 | 
				
			||||||
% 	chr_flag(Flag, Old, New, Goal).
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
% chr_flag(toplevel_show_store, Old, New, Goal) :-
 | 
					 | 
				
			||||||
% 	clause(current_toplevel_show_store(Old), true, Ref),
 | 
					 | 
				
			||||||
% 	(   New==Old -> true
 | 
					 | 
				
			||||||
% 	;   must_be(New, oneof([on,off]), Goal, 3),
 | 
					 | 
				
			||||||
% 	    erase(Ref),
 | 
					 | 
				
			||||||
% 	    assertz(current_toplevel_show_store(New))
 | 
					 | 
				
			||||||
% 	).
 | 
					 | 
				
			||||||
% chr_flag(generate_debug_info, Old, New, Goal) :-
 | 
					 | 
				
			||||||
% 	clause(current_generate_debug_info(Old), true, Ref),
 | 
					 | 
				
			||||||
% 	(   New==Old -> true
 | 
					 | 
				
			||||||
% 	;   must_be(New, oneof([false,true]), Goal, 3),
 | 
					 | 
				
			||||||
% 	    erase(Ref),
 | 
					 | 
				
			||||||
% 	    assertz(current_generate_debug_info(New))
 | 
					 | 
				
			||||||
% 	).
 | 
					 | 
				
			||||||
% chr_flag(optimize, Old, New, Goal) :-
 | 
					 | 
				
			||||||
% 	clause(current_optimize(Old), true, Ref),
 | 
					 | 
				
			||||||
% 	(   New==Old -> true
 | 
					 | 
				
			||||||
% 	;   must_be(New, oneof([full,off]), Goal, 3),
 | 
					 | 
				
			||||||
% 	    erase(Ref),
 | 
					 | 
				
			||||||
% 	    assertz(current_optimize(New))
 | 
					 | 
				
			||||||
% 	).
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
% all_stores_goal(Goal, CVAs) :-
 | 
					 | 
				
			||||||
% 	chr_flag(toplevel_show_store, on, on), !,
 | 
					 | 
				
			||||||
% 	findall(C-CVAs, find_chr_constraint(C), Pairs),
 | 
					 | 
				
			||||||
% 	andify(Pairs, Goal, CVAs).
 | 
					 | 
				
			||||||
% all_stores_goal(true, _).
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
% andify([], true, _).
 | 
					 | 
				
			||||||
% andify([X-Vs|L], Conj, Vs) :- andify(L, X, Conj, Vs).
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
% andify([], X, X, _).
 | 
					 | 
				
			||||||
% andify([Y-Vs|L], X, (X,Conj), Vs) :- andify(L, Y, Conj, Vs).
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
% :- multifile user:term_expansion/6.
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
% user:term_expansion(In, _, Ids, Out, [], [chr|Ids]) :-
 | 
					 | 
				
			||||||
% 	nonvar(In),
 | 
					 | 
				
			||||||
% 	nonmember(chr, Ids),
 | 
					 | 
				
			||||||
% 	chr_expand(In, Out), !.
 | 
					 | 
				
			||||||
% 
 | 
					 | 
				
			||||||
%% SICStus end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%% for SSS %%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
add_pragma_to_chr_rule((Name @ Rule), Pragma, Result) :- !,
 | 
					 | 
				
			||||||
	add_pragma_to_chr_rule(Rule,Pragma,NRule),
 | 
					 | 
				
			||||||
	Result = (Name @ NRule).
 | 
					 | 
				
			||||||
add_pragma_to_chr_rule((Rule pragma Pragmas), Pragma, Result) :- !,
 | 
					 | 
				
			||||||
	Result = (Rule pragma (Pragma,Pragmas)).
 | 
					 | 
				
			||||||
add_pragma_to_chr_rule((Head ==> Body), Pragma, Result) :- !,
 | 
					 | 
				
			||||||
	Result = ((Head ==> Body) pragma Pragma).
 | 
					 | 
				
			||||||
add_pragma_to_chr_rule((Head <=> Body), Pragma, Result) :- !,
 | 
					 | 
				
			||||||
	Result = ((Head <=> Body) pragma Pragma).
 | 
					 | 
				
			||||||
add_pragma_to_chr_rule(Term,_,Term).
 | 
					 | 
				
			||||||
@@ -1,202 +0,0 @@
 | 
				
			|||||||
/*  $Id: chr_swi_bootstrap.pl,v 1.4 2008-03-13 17:43:13 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Author:        Tom Schrijvers
 | 
					 | 
				
			||||||
    E-mail:        Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2003-2004, K.U. Leuven
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- module(chr,
 | 
					 | 
				
			||||||
	  [ chr_compile_step1/2		% +CHRFile, -PlFile
 | 
					 | 
				
			||||||
	  , chr_compile_step2/2		% +CHRFile, -PlFile
 | 
					 | 
				
			||||||
	  , chr_compile_step3/2		% +CHRFile, -PlFile
 | 
					 | 
				
			||||||
	  , chr_compile_step4/2		% +CHRFile, -PlFile
 | 
					 | 
				
			||||||
	  , chr_compile/3
 | 
					 | 
				
			||||||
	  ]).
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
:- if(current_prolog_flag(dialect, yap)).
 | 
					 | 
				
			||||||
:- hide(atomic_concat).
 | 
					 | 
				
			||||||
:- endif.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- expects_dialect(swi).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- use_module(library(listing)). % portray_clause/2
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
:- include(chr_op).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		 /*******************************
 | 
					 | 
				
			||||||
		 *    FILE-TO-FILE COMPILER	*
 | 
					 | 
				
			||||||
		 *******************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	chr_compile(+CHRFile, -PlFile)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Compile a CHR specification into a Prolog file
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_compile_step1(From, To) :-
 | 
					 | 
				
			||||||
	use_module('chr_translate_bootstrap.pl'),
 | 
					 | 
				
			||||||
	chr_compile(From, To, informational).
 | 
					 | 
				
			||||||
chr_compile_step2(From, To) :-
 | 
					 | 
				
			||||||
	use_module('chr_translate_bootstrap1.pl'),
 | 
					 | 
				
			||||||
	chr_compile(From, To, informational).
 | 
					 | 
				
			||||||
chr_compile_step3(From, To) :-
 | 
					 | 
				
			||||||
	use_module('chr_translate_bootstrap2.pl'),
 | 
					 | 
				
			||||||
	chr_compile(From, To, informational).
 | 
					 | 
				
			||||||
chr_compile_step4(From, To) :-
 | 
					 | 
				
			||||||
	use_module('chr_translate.pl'),
 | 
					 | 
				
			||||||
	chr_compile(From, To, informational).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_compile(From, To, MsgLevel) :-
 | 
					 | 
				
			||||||
	print_message(MsgLevel, chr(start(From))),
 | 
					 | 
				
			||||||
	read_chr_file_to_terms(From,Declarations),
 | 
					 | 
				
			||||||
	% read_file_to_terms(From, Declarations,
 | 
					 | 
				
			||||||
	% 		   [ module(chr) 	% get operators from here
 | 
					 | 
				
			||||||
	%		   ]),
 | 
					 | 
				
			||||||
	print_message(silent, chr(translate(From))),
 | 
					 | 
				
			||||||
	chr_translate(Declarations, Declarations1),
 | 
					 | 
				
			||||||
	insert_declarations(Declarations1, NewDeclarations),
 | 
					 | 
				
			||||||
	print_message(silent, chr(write(To))),
 | 
					 | 
				
			||||||
	writefile(To, From, NewDeclarations),
 | 
					 | 
				
			||||||
	print_message(MsgLevel, chr(end(From, To))).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
specific_declarations([(:- use_module('chr_runtime')),
 | 
					 | 
				
			||||||
		       (:- style_check(-discontiguous))|Tail], Tail).
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SICStus begin
 | 
					 | 
				
			||||||
%% specific_declarations([(:- use_module('chr_runtime')),
 | 
					 | 
				
			||||||
%%                     (:-use_module(chr_hashtable_store)),
 | 
					 | 
				
			||||||
%% 		       (:- use_module('hpattvars')),
 | 
					 | 
				
			||||||
%% 		       (:- use_module('b_globval')),
 | 
					 | 
				
			||||||
%% 		       (:- use_module('hprolog')),  % needed ?
 | 
					 | 
				
			||||||
%% 		       (:- set_prolog_flag(discontiguous_warnings,off)),
 | 
					 | 
				
			||||||
%% 		       (:- set_prolog_flag(single_var_warnings,off))|Tail], Tail).
 | 
					 | 
				
			||||||
%% SICStus end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
insert_declarations(Clauses0, Clauses) :-
 | 
					 | 
				
			||||||
	specific_declarations(Decls,Tail),
 | 
					 | 
				
			||||||
	(Clauses0 = [(:- module(M,E))|FileBody] ->
 | 
					 | 
				
			||||||
	    Clauses = [ (:- module(M,E))|Decls],
 | 
					 | 
				
			||||||
	    Tail = FileBody
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
	    Clauses = Decls,
 | 
					 | 
				
			||||||
	    Tail = Clauses0
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	writefile(+File, +From, +Desclarations)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Write translated CHR declarations to a File.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
writefile(File, From, Declarations) :-
 | 
					 | 
				
			||||||
	open(File, write, Out),
 | 
					 | 
				
			||||||
	writeheader(From, Out),
 | 
					 | 
				
			||||||
	writecontent(Declarations, Out),
 | 
					 | 
				
			||||||
	close(Out).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
writecontent([], _).
 | 
					 | 
				
			||||||
writecontent([D|Ds], Out) :-
 | 
					 | 
				
			||||||
	portray_clause(Out, D),		% SWI-Prolog
 | 
					 | 
				
			||||||
	writecontent(Ds, Out).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
writeheader(File, Out) :-
 | 
					 | 
				
			||||||
	format(Out, '/*  Generated by CHR bootstrap compiler~n', []),
 | 
					 | 
				
			||||||
	format(Out, '    From: ~w~n', [File]),
 | 
					 | 
				
			||||||
	format_date(Out),
 | 
					 | 
				
			||||||
	format(Out, '    DO NOT EDIT.  EDIT THE CHR FILE INSTEAD~n', []),
 | 
					 | 
				
			||||||
	format(Out, '*/~n~n', []).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
format_date(Out) :-
 | 
					 | 
				
			||||||
	get_time(Now),
 | 
					 | 
				
			||||||
	convert_time(Now, Date),
 | 
					 | 
				
			||||||
    % vsc: this is a string
 | 
					 | 
				
			||||||
	format(Out, '    Date: ~s~n~n', [Date]).
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SICStus begin
 | 
					 | 
				
			||||||
%% :- use_module(library(system), [datime/1]).
 | 
					 | 
				
			||||||
%% format_date(Out) :-
 | 
					 | 
				
			||||||
%% 	datime(datime(Year,Month,Day,Hour,Min,Sec)),
 | 
					 | 
				
			||||||
%% 	format(Out, '    Date: ~d-~d-~d ~d:~d:~d~n~n', [Day,Month,Year,Hour,Min,Sec]).
 | 
					 | 
				
			||||||
%% SICStus end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		 /*******************************
 | 
					 | 
				
			||||||
		 *	       MESSAGES		*
 | 
					 | 
				
			||||||
		 *******************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- multifile
 | 
					 | 
				
			||||||
	prolog:message/3.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
prolog:message(chr(start(File))) -->
 | 
					 | 
				
			||||||
	{ file_base_name(File, Base)
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	[ 'Translating CHR file ~w'-[Base] ].
 | 
					 | 
				
			||||||
prolog:message(chr(end(_From, To))) -->
 | 
					 | 
				
			||||||
	{ file_base_name(To, Base)
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
	[ 'Written translation to ~w'-[Base] ].
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
read_chr_file_to_terms(Spec, Terms) :-
 | 
					 | 
				
			||||||
	chr_absolute_file_name(Spec, [ access(read) ], Path),
 | 
					 | 
				
			||||||
	open(Path, read, Fd, []),
 | 
					 | 
				
			||||||
	read_chr_stream_to_terms(Fd, Terms),
 | 
					 | 
				
			||||||
	close(Fd).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
read_chr_stream_to_terms(Fd, Terms) :-
 | 
					 | 
				
			||||||
	chr_local_only_read_term(Fd, C0, [ module(chr) ]),
 | 
					 | 
				
			||||||
	read_chr_stream_to_terms(C0, Fd, Terms).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
read_chr_stream_to_terms(end_of_file, _, []) :- !.
 | 
					 | 
				
			||||||
read_chr_stream_to_terms(C, Fd, [C|T]) :-
 | 
					 | 
				
			||||||
	( ground(C),
 | 
					 | 
				
			||||||
	  C = (:- op(Priority,Type,Name)) ->
 | 
					 | 
				
			||||||
		op(Priority,Type,Name)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		true
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	chr_local_only_read_term(Fd, C2, [module(chr)]),
 | 
					 | 
				
			||||||
	read_chr_stream_to_terms(C2, Fd, T).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SWI begin
 | 
					 | 
				
			||||||
chr_local_only_read_term(A,B,C) :- read_term(A,B,C).
 | 
					 | 
				
			||||||
chr_absolute_file_name(A,B,C) :- absolute_file_name(A,B,C).
 | 
					 | 
				
			||||||
%% SWI end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%% SICStus begin
 | 
					 | 
				
			||||||
%% chr_local_only_read_term(A,B,_) :- read_term(A,B,[]).
 | 
					 | 
				
			||||||
%% chr_absolute_file_name(A,B,C) :- absolute_file_name(A,C,B).
 | 
					 | 
				
			||||||
%% SICStus end
 | 
					 | 
				
			||||||
@@ -1,13 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- multifile user:file_search_path/2.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- add_to_path('.').
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
:- use_module(library(swi)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- yap_flag(unknown,error).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- include('chr_swi_bootstrap.pl').
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,13 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- multifile user:file_search_path/2.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- add_to_path('@srcdir@').
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
:- use_module(library(swi)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- yap_flag(unknown,error).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- include('chr_swi_bootstrap.pl').
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -1,170 +0,0 @@
 | 
				
			|||||||
/*  $Id: chr_test.pl,v 1.3 2008-03-13 14:38:00 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Author:        Jan Wielemaker
 | 
					 | 
				
			||||||
    E-mail:        wielemak@science.uva.nl
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2005,2006, University of Amsterdam
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- asserta(user:file_search_path(chr, '.')).
 | 
					 | 
				
			||||||
:- asserta(user:file_search_path(library, '.')).
 | 
					 | 
				
			||||||
:- use_module(library(chr)).
 | 
					 | 
				
			||||||
%%  :- use_module(chr).			% == library(chr)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- set_prolog_flag(optimise, true).
 | 
					 | 
				
			||||||
%:- set_prolog_flag(trace_gc, true).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- format('CHR test suite.  To run all tests run ?- test.~n~n', []).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		 /*******************************
 | 
					 | 
				
			||||||
		 *	      SCRIPTS		*
 | 
					 | 
				
			||||||
		 *******************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- dynamic
 | 
					 | 
				
			||||||
	script_dir/1.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
set_script_dir :-
 | 
					 | 
				
			||||||
	script_dir(_), !.
 | 
					 | 
				
			||||||
set_script_dir :-
 | 
					 | 
				
			||||||
	find_script_dir(Dir),
 | 
					 | 
				
			||||||
	assert(script_dir(Dir)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
find_script_dir(Dir) :-
 | 
					 | 
				
			||||||
	prolog_load_context(file, File),
 | 
					 | 
				
			||||||
	follow_links(File, RealFile),
 | 
					 | 
				
			||||||
	file_directory_name(RealFile, Dir).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
follow_links(File, RealFile) :-
 | 
					 | 
				
			||||||
	read_link(File, _, RealFile), !.
 | 
					 | 
				
			||||||
follow_links(File, File).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- set_script_dir.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
run_test_script(Script) :-
 | 
					 | 
				
			||||||
	file_base_name(Script, Base),
 | 
					 | 
				
			||||||
	file_name_extension(Pred, _, Base),
 | 
					 | 
				
			||||||
	format(' ~w~n',[Script]),
 | 
					 | 
				
			||||||
	load_files(Script, []), %[silent(true)]),
 | 
					 | 
				
			||||||
	Pred.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
run_test_scripts(Directory) :-
 | 
					 | 
				
			||||||
	(   script_dir(ScriptDir),
 | 
					 | 
				
			||||||
	    concat_atom([ScriptDir, /, Directory], Dir),
 | 
					 | 
				
			||||||
	    exists_directory(Dir)
 | 
					 | 
				
			||||||
	->  true
 | 
					 | 
				
			||||||
	;   Dir = Directory
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	atom_concat(Dir, '/*.chr', Pattern),
 | 
					 | 
				
			||||||
	expand_file_name(Pattern, Files),
 | 
					 | 
				
			||||||
	file_base_name(Dir, BaseDir),
 | 
					 | 
				
			||||||
	format('Running scripts from ~w ', [BaseDir]), flush,
 | 
					 | 
				
			||||||
	run_scripts(Files),
 | 
					 | 
				
			||||||
	format(' done~n').
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
run_scripts([]).
 | 
					 | 
				
			||||||
run_scripts([H|T]) :-
 | 
					 | 
				
			||||||
	(   catch(run_test_script(H), Except, true)
 | 
					 | 
				
			||||||
	->  (   var(Except)
 | 
					 | 
				
			||||||
	    ->  put(.), flush
 | 
					 | 
				
			||||||
	    ;   Except = blocked(Reason)
 | 
					 | 
				
			||||||
	    ->  assert(blocked(H, Reason)),
 | 
					 | 
				
			||||||
		put(!), flush
 | 
					 | 
				
			||||||
	    ;   script_failed(H, Except)
 | 
					 | 
				
			||||||
	    )
 | 
					 | 
				
			||||||
	;   script_failed(H, fail)
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	run_scripts(T).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
script_failed(File, fail) :-
 | 
					 | 
				
			||||||
	format('~NScript ~w failed~n', [File]),
 | 
					 | 
				
			||||||
	assert(failed(script(File))).
 | 
					 | 
				
			||||||
script_failed(File, Except) :-
 | 
					 | 
				
			||||||
	message_to_string(Except, Error),
 | 
					 | 
				
			||||||
	format('~NScript ~w failed: ~w~n', [File, Error]),
 | 
					 | 
				
			||||||
	assert(failed(script(File))).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		 /*******************************
 | 
					 | 
				
			||||||
		 *        TEST MAIN-LOOP	*
 | 
					 | 
				
			||||||
		 *******************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
testdir('Tests').
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- dynamic
 | 
					 | 
				
			||||||
	failed/1,
 | 
					 | 
				
			||||||
	blocked/2.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
test :-
 | 
					 | 
				
			||||||
	retractall(failed(_)),
 | 
					 | 
				
			||||||
	retractall(blocked(_,_)),
 | 
					 | 
				
			||||||
	scripts,
 | 
					 | 
				
			||||||
	report_blocked,
 | 
					 | 
				
			||||||
	report_failed.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
scripts :-
 | 
					 | 
				
			||||||
	forall(testdir(Dir), run_test_scripts(Dir)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
report_blocked :-
 | 
					 | 
				
			||||||
	findall(Head-Reason, blocked(Head, Reason), L),
 | 
					 | 
				
			||||||
	(   L \== []
 | 
					 | 
				
			||||||
        ->  format('~nThe following tests are blocked:~n', []),
 | 
					 | 
				
			||||||
	    (	member(Head-Reason, L),
 | 
					 | 
				
			||||||
		format('    ~p~t~40|~w~n', [Head, Reason]),
 | 
					 | 
				
			||||||
		fail
 | 
					 | 
				
			||||||
	    ;	true
 | 
					 | 
				
			||||||
	    )
 | 
					 | 
				
			||||||
        ;   true
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
report_failed :-
 | 
					 | 
				
			||||||
	findall(X, failed(X), L),
 | 
					 | 
				
			||||||
	length(L, Len),
 | 
					 | 
				
			||||||
	(   Len > 0
 | 
					 | 
				
			||||||
        ->  format('~n*** ~w tests failed ***~n', [Len]),
 | 
					 | 
				
			||||||
	    fail
 | 
					 | 
				
			||||||
        ;   format('~nAll tests passed~n', [])
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
test_failed(R, Except) :-
 | 
					 | 
				
			||||||
	clause(Head, _, R),
 | 
					 | 
				
			||||||
	functor(Head, Name, 1),
 | 
					 | 
				
			||||||
	arg(1, Head, TestName),
 | 
					 | 
				
			||||||
	clause_property(R, line_count(Line)),
 | 
					 | 
				
			||||||
	clause_property(R, file(File)),
 | 
					 | 
				
			||||||
	(   Except == fail
 | 
					 | 
				
			||||||
	->  format('~N~w:~d: Test ~w(~w) failed~n',
 | 
					 | 
				
			||||||
		   [File, Line, Name, TestName])
 | 
					 | 
				
			||||||
	;   message_to_string(Except, Error),
 | 
					 | 
				
			||||||
	    format('~N~w:~d: Test ~w(~w):~n~t~8|ERROR: ~w~n',
 | 
					 | 
				
			||||||
		   [File, Line, Name, TestName, Error])
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	assert(failed(Head)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
blocked(Reason) :-
 | 
					 | 
				
			||||||
	throw(blocked(Reason)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,224 +0,0 @@
 | 
				
			|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
% Author:	Tom Schrijvers
 | 
					 | 
				
			||||||
% Email:	Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
% Copyright:	K.U.Leuven 2004
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%%   ____          _         ____ _                  _             
 | 
					 | 
				
			||||||
%%  / ___|___   __| | ___   / ___| | ___  __ _ _ __ (_)_ __   __ _ 
 | 
					 | 
				
			||||||
%% | |   / _ \ / _` |/ _ \ | |   | |/ _ \/ _` | '_ \| | '_ \ / _` |
 | 
					 | 
				
			||||||
%% | |__| (_) | (_| |  __/ | |___| |  __/ (_| | | | | | | | | (_| |
 | 
					 | 
				
			||||||
%%  \____\___/ \__,_|\___|  \____|_|\___|\__,_|_| |_|_|_| |_|\__, |
 | 
					 | 
				
			||||||
%%                                                           |___/ 
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%% To be done:
 | 
					 | 
				
			||||||
%%	inline clauses
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- module(clean_code,
 | 
					 | 
				
			||||||
	[
 | 
					 | 
				
			||||||
		clean_clauses/2
 | 
					 | 
				
			||||||
	]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- use_module(hprolog).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean_clauses(Clauses,NClauses) :-
 | 
					 | 
				
			||||||
	clean_clauses1(Clauses,Clauses1),
 | 
					 | 
				
			||||||
	merge_clauses(Clauses1,NClauses).
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
% CLEAN CLAUSES
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
%	- move neck unification into the head of the clause	
 | 
					 | 
				
			||||||
%	- drop true body
 | 
					 | 
				
			||||||
%	- specialize control flow goal wrt true and fail
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean_clauses1([],[]).
 | 
					 | 
				
			||||||
clean_clauses1([C|Cs],[NC|NCs]) :-
 | 
					 | 
				
			||||||
	clean_clause(C,NC),
 | 
					 | 
				
			||||||
	clean_clauses1(Cs,NCs).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean_clause(Clause,NClause) :-
 | 
					 | 
				
			||||||
	( Clause = (Head :- Body) ->
 | 
					 | 
				
			||||||
		clean_goal(Body,Body1),
 | 
					 | 
				
			||||||
		move_unification_into_head(Head,Body1,NHead,NBody),
 | 
					 | 
				
			||||||
		( NBody == true ->
 | 
					 | 
				
			||||||
			NClause = NHead
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			NClause = (NHead :- NBody)
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
	; Clause = '$source_location'(File,Line) : ActualClause ->
 | 
					 | 
				
			||||||
		NClause = '$source_location'(File,Line) :  NActualClause,
 | 
					 | 
				
			||||||
		clean_clause(ActualClause,NActualClause)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		NClause = Clause
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
clean_goal(Goal,NGoal) :-
 | 
					 | 
				
			||||||
	var(Goal), !,
 | 
					 | 
				
			||||||
	NGoal = Goal.
 | 
					 | 
				
			||||||
clean_goal((G1,G2),NGoal) :-
 | 
					 | 
				
			||||||
	!,
 | 
					 | 
				
			||||||
	clean_goal(G1,NG1),
 | 
					 | 
				
			||||||
	clean_goal(G2,NG2),
 | 
					 | 
				
			||||||
	( NG1 == true ->
 | 
					 | 
				
			||||||
		NGoal = NG2
 | 
					 | 
				
			||||||
	; NG2 == true ->
 | 
					 | 
				
			||||||
		NGoal = NG1
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		NGoal = (NG1,NG2)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
clean_goal((If -> Then ; Else),NGoal) :-
 | 
					 | 
				
			||||||
	!,
 | 
					 | 
				
			||||||
	clean_goal(If,NIf),
 | 
					 | 
				
			||||||
	( NIf == true ->
 | 
					 | 
				
			||||||
		clean_goal(Then,NThen),
 | 
					 | 
				
			||||||
		NGoal = NThen
 | 
					 | 
				
			||||||
	; NIf == fail ->
 | 
					 | 
				
			||||||
		clean_goal(Else,NElse),
 | 
					 | 
				
			||||||
		NGoal = NElse
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		clean_goal(Then,NThen),
 | 
					 | 
				
			||||||
		clean_goal(Else,NElse),
 | 
					 | 
				
			||||||
		NGoal = (NIf -> NThen; NElse)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
clean_goal((G1 ; G2),NGoal) :-
 | 
					 | 
				
			||||||
	!,
 | 
					 | 
				
			||||||
	clean_goal(G1,NG1),
 | 
					 | 
				
			||||||
	clean_goal(G2,NG2),
 | 
					 | 
				
			||||||
	( NG1 == fail ->
 | 
					 | 
				
			||||||
		NGoal = NG2
 | 
					 | 
				
			||||||
	; NG2 == fail ->
 | 
					 | 
				
			||||||
		NGoal = NG1
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		NGoal = (NG1 ; NG2)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
clean_goal(once(G),NGoal) :-
 | 
					 | 
				
			||||||
	!,
 | 
					 | 
				
			||||||
	clean_goal(G,NG),
 | 
					 | 
				
			||||||
	( NG == true ->
 | 
					 | 
				
			||||||
		NGoal = true
 | 
					 | 
				
			||||||
	; NG == fail ->
 | 
					 | 
				
			||||||
		NGoal = fail
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		NGoal = once(NG)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
clean_goal((G1 -> G2),NGoal) :-
 | 
					 | 
				
			||||||
	!,
 | 
					 | 
				
			||||||
	clean_goal(G1,NG1),
 | 
					 | 
				
			||||||
	( NG1 == true ->
 | 
					 | 
				
			||||||
		clean_goal(G2,NGoal)
 | 
					 | 
				
			||||||
	; NG1 == fail ->
 | 
					 | 
				
			||||||
		NGoal = fail
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		clean_goal(G2,NG2),
 | 
					 | 
				
			||||||
		NGoal = (NG1 -> NG2)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
clean_goal(Goal,Goal).
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
move_unification_into_head(Head,Body,NHead,NBody) :-
 | 
					 | 
				
			||||||
	conj2list(Body,BodyList),
 | 
					 | 
				
			||||||
	move_unification_into_head_(BodyList,Head,NHead,NBody).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
move_unification_into_head_([],Head,Head,true).
 | 
					 | 
				
			||||||
move_unification_into_head_([G|Gs],Head,NHead,NBody) :-
 | 
					 | 
				
			||||||
	( nonvar(G), G = (X = Y) ->
 | 
					 | 
				
			||||||
		term_variables(Gs,GsVars),
 | 
					 | 
				
			||||||
		( var(X), ( \+ memberchk_eq(X,GsVars) ; atomic(Y)) ->
 | 
					 | 
				
			||||||
			X = Y,
 | 
					 | 
				
			||||||
			move_unification_into_head_(Gs,Head,NHead,NBody)
 | 
					 | 
				
			||||||
		; var(Y), (\+ memberchk_eq(Y,GsVars) ; atomic(X)) ->
 | 
					 | 
				
			||||||
			X = Y,
 | 
					 | 
				
			||||||
			move_unification_into_head_(Gs,Head,NHead,NBody)
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			Head = NHead,
 | 
					 | 
				
			||||||
			list2conj([G|Gs],NBody)
 | 
					 | 
				
			||||||
		)	
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		Head = NHead,
 | 
					 | 
				
			||||||
		list2conj([G|Gs],NBody)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
conj2list(Conj,L) :-				%% transform conjunctions to list
 | 
					 | 
				
			||||||
  conj2list(Conj,L,[]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
conj2list(G,L,T) :-
 | 
					 | 
				
			||||||
	var(G), !,
 | 
					 | 
				
			||||||
	L = [G|T].
 | 
					 | 
				
			||||||
conj2list(true,L,L) :- !.
 | 
					 | 
				
			||||||
conj2list(Conj,L,T) :-
 | 
					 | 
				
			||||||
  Conj = (G1,G2), !,
 | 
					 | 
				
			||||||
  conj2list(G1,L,T1),
 | 
					 | 
				
			||||||
  conj2list(G2,T1,T).
 | 
					 | 
				
			||||||
conj2list(G,[G | T],T).
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
list2conj([],true).
 | 
					 | 
				
			||||||
list2conj([G],X) :- !, X = G.
 | 
					 | 
				
			||||||
list2conj([G|Gs],C) :-
 | 
					 | 
				
			||||||
	( G == true ->				%% remove some redundant trues
 | 
					 | 
				
			||||||
		list2conj(Gs,C)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		C = (G,R),
 | 
					 | 
				
			||||||
		list2conj(Gs,R)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
% MERGE CLAUSES
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
%	Find common prefixes of successive clauses and share them.
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
%	Note: we assume that the prefix does not generate a side effect.
 | 
					 | 
				
			||||||
%
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
merge_clauses([],[]).
 | 
					 | 
				
			||||||
merge_clauses([C],[C]).
 | 
					 | 
				
			||||||
merge_clauses([X,Y|Clauses],NClauses) :-
 | 
					 | 
				
			||||||
	( merge_two_clauses(X,Y,Clause) ->
 | 
					 | 
				
			||||||
		merge_clauses([Clause|Clauses],NClauses)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		NClauses = [X|RClauses],
 | 
					 | 
				
			||||||
		merge_clauses([Y|Clauses],RClauses)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
merge_two_clauses('$source_location'(F1,L1) : C1,
 | 
					 | 
				
			||||||
		  '$source_location'(_F2,_L2) : C2,
 | 
					 | 
				
			||||||
		  Result) :- !,
 | 
					 | 
				
			||||||
	merge_two_clauses(C1,C2,C),
 | 
					 | 
				
			||||||
	Result = '$source_location'(F1,L1) : C.
 | 
					 | 
				
			||||||
merge_two_clauses((H1 :- B1), (H2 :- B2), (H :- B)) :-
 | 
					 | 
				
			||||||
	H1 =@= H2,
 | 
					 | 
				
			||||||
	H1 = H,
 | 
					 | 
				
			||||||
	conj2list(B1,List1),
 | 
					 | 
				
			||||||
	conj2list(B2,List2),
 | 
					 | 
				
			||||||
	merge_lists(List1,List2,H1,H2,Unifier,List,NList1,NList2),
 | 
					 | 
				
			||||||
	List \= [],
 | 
					 | 
				
			||||||
	H1 = H2,
 | 
					 | 
				
			||||||
	call(Unifier),
 | 
					 | 
				
			||||||
	list2conj(List,Prefix),
 | 
					 | 
				
			||||||
	list2conj(NList1,NB1),
 | 
					 | 
				
			||||||
	( NList2 == (!) ->
 | 
					 | 
				
			||||||
		B = Prefix
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		list2conj(NList2,NB2),
 | 
					 | 
				
			||||||
		B = (Prefix,(NB1 ; NB2))
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
merge_lists([],[],_,_,true,[],[],[]).
 | 
					 | 
				
			||||||
merge_lists([],L2,_,_,true,[],[],L2).
 | 
					 | 
				
			||||||
merge_lists([!|Xs],_,_,_,true,[!|Xs],[],!) :- !.
 | 
					 | 
				
			||||||
merge_lists([X|Xs],[],_,_,true,[],[X|Xs],[]).
 | 
					 | 
				
			||||||
merge_lists([X|Xs],[Y|Ys],H1,H2,Unifier,Common,N1,N2) :-
 | 
					 | 
				
			||||||
	( H1-X =@= H2-Y ->
 | 
					 | 
				
			||||||
		Unifier = (X = Y, RUnifier),
 | 
					 | 
				
			||||||
		Common = [X|NCommon],
 | 
					 | 
				
			||||||
		merge_lists(Xs,Ys,H1/X,H2/Y,RUnifier,NCommon,N1,N2)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		Unifier = true,
 | 
					 | 
				
			||||||
		Common = [],
 | 
					 | 
				
			||||||
		N1 = [X|Xs],
 | 
					 | 
				
			||||||
		N2 = [Y|Ys]
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
@@ -1,75 +0,0 @@
 | 
				
			|||||||
/*  $Id: find.pl,v 1.3 2008-03-13 14:38:01 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Author:        Bart Demoen, Tom Schrijvers
 | 
					 | 
				
			||||||
    E-mail:        Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2003-2004, K.U. Leuven
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- module(chr_find,
 | 
					 | 
				
			||||||
	[
 | 
					 | 
				
			||||||
		find_with_var_identity/4,
 | 
					 | 
				
			||||||
		forall/3,
 | 
					 | 
				
			||||||
		forsome/3
 | 
					 | 
				
			||||||
	]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- use_module(library(lists)).
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- meta_predicate
 | 
					 | 
				
			||||||
	find_with_var_identity(?, +, :, -),
 | 
					 | 
				
			||||||
	forall(-, +, :),
 | 
					 | 
				
			||||||
	forsome(-, +, :).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
find_with_var_identity(Template, IdVars, Goal, Answers) :-
 | 
					 | 
				
			||||||
        Key = foo(IdVars),
 | 
					 | 
				
			||||||
	copy_term_nat(Template-Key-Goal,TemplateC-KeyC-GoalC),
 | 
					 | 
				
			||||||
        findall(KeyC - TemplateC, GoalC, As),
 | 
					 | 
				
			||||||
        smash(As,Key,Answers).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
smash([],_,[]).
 | 
					 | 
				
			||||||
smash([Key-T|R],Key,[T|NR]) :- smash(R,Key,NR).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
forall(X,L,G) :-
 | 
					 | 
				
			||||||
	\+ (member(X,L), \+ call(G)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
forsome(X,L,G) :-
 | 
					 | 
				
			||||||
	member(X,L),
 | 
					 | 
				
			||||||
	call(G), !.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
:- dynamic
 | 
					 | 
				
			||||||
	user:goal_expansion/2.
 | 
					 | 
				
			||||||
:- multifile
 | 
					 | 
				
			||||||
	user:goal_expansion/2.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
user:goal_expansion(forall(Element,List,Test), GoalOut) :-
 | 
					 | 
				
			||||||
	nonvar(Test),
 | 
					 | 
				
			||||||
	Test =.. [Functor,Arg],
 | 
					 | 
				
			||||||
	Arg == Element,
 | 
					 | 
				
			||||||
	GoalOut = once(maplist(Functor,List)).
 | 
					 | 
				
			||||||
@@ -1,511 +0,0 @@
 | 
				
			|||||||
:- module(guard_entailment,
 | 
					 | 
				
			||||||
	  [ entails_guard/2,
 | 
					 | 
				
			||||||
	    simplify_guards/5
 | 
					 | 
				
			||||||
	  ]).
 | 
					 | 
				
			||||||
:- include(chr_op).
 | 
					 | 
				
			||||||
:- use_module(hprolog).
 | 
					 | 
				
			||||||
:- use_module(builtins).
 | 
					 | 
				
			||||||
:- use_module(chr_compiler_errors).
 | 
					 | 
				
			||||||
:- chr_option(debug, off).
 | 
					 | 
				
			||||||
:- chr_option(optimize, full).
 | 
					 | 
				
			||||||
:- chr_option(verbosity,off).
 | 
					 | 
				
			||||||
%:- chr_option(dynattr,on).
 | 
					 | 
				
			||||||
:- chr_constraint known/1, test/1, cleanup/0, variables/1.
 | 
					 | 
				
			||||||
entails_guard(A, B) :-
 | 
					 | 
				
			||||||
	copy_term_nat((A, B), (C, F)),
 | 
					 | 
				
			||||||
	term_variables(C, D),
 | 
					 | 
				
			||||||
	variables(D),
 | 
					 | 
				
			||||||
	sort(C, E),
 | 
					 | 
				
			||||||
	entails_guard2(E), !,
 | 
					 | 
				
			||||||
	test(F), !,
 | 
					 | 
				
			||||||
	cleanup.
 | 
					 | 
				
			||||||
entails_guard2([]).
 | 
					 | 
				
			||||||
entails_guard2([A|B]) :-
 | 
					 | 
				
			||||||
	known(A),
 | 
					 | 
				
			||||||
	entails_guard2(B).
 | 
					 | 
				
			||||||
simplify_guards(A, H, B, G, I) :-
 | 
					 | 
				
			||||||
	copy_term_nat((A, B), (C, E)),
 | 
					 | 
				
			||||||
	term_variables(C, D),
 | 
					 | 
				
			||||||
	variables(D),
 | 
					 | 
				
			||||||
	sort(C,Z),
 | 
					 | 
				
			||||||
	entails_guard2(Z), !,
 | 
					 | 
				
			||||||
	simplify(E, F),
 | 
					 | 
				
			||||||
	simplified(B, F, G, H, I), !,
 | 
					 | 
				
			||||||
	cleanup.
 | 
					 | 
				
			||||||
simplified([], [], [], A, A).
 | 
					 | 
				
			||||||
simplified([A|B], [keep|C], [A|D], E, F) :-
 | 
					 | 
				
			||||||
	simplified(B, C, D, E, F).
 | 
					 | 
				
			||||||
simplified([_|_], [fail|_], fail, A, A).
 | 
					 | 
				
			||||||
simplified([A|B], [true|L], [I|M], F, J) :-
 | 
					 | 
				
			||||||
	builtins:binds_b(A, C),
 | 
					 | 
				
			||||||
	term_variables(B, D),
 | 
					 | 
				
			||||||
	intersect_eq(C, D, E), !,
 | 
					 | 
				
			||||||
	(   E=[]
 | 
					 | 
				
			||||||
	->  term_variables(F, G),
 | 
					 | 
				
			||||||
	    intersect_eq(C, G, H), !,
 | 
					 | 
				
			||||||
	    (   H=[]
 | 
					 | 
				
			||||||
	    ->  I=true,
 | 
					 | 
				
			||||||
		J=K
 | 
					 | 
				
			||||||
	    ;   I=true,
 | 
					 | 
				
			||||||
		J= (A, K)
 | 
					 | 
				
			||||||
	    )
 | 
					 | 
				
			||||||
	;   I=A,
 | 
					 | 
				
			||||||
	    J=K
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	simplified(B, L, M, F, K).
 | 
					 | 
				
			||||||
simplify([], []).
 | 
					 | 
				
			||||||
simplify([A|D], [B|E]) :-
 | 
					 | 
				
			||||||
	(   \+try(true, A)
 | 
					 | 
				
			||||||
	->  B=true
 | 
					 | 
				
			||||||
	;   builtins:negate_b(A, C),
 | 
					 | 
				
			||||||
	    (   \+try(true, C)
 | 
					 | 
				
			||||||
	    ->  B=fail
 | 
					 | 
				
			||||||
	    ;   B=keep
 | 
					 | 
				
			||||||
	    )
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	known(A),
 | 
					 | 
				
			||||||
	simplify(D, E).
 | 
					 | 
				
			||||||
try(A, B) :-
 | 
					 | 
				
			||||||
	(   known(A)
 | 
					 | 
				
			||||||
	->  true
 | 
					 | 
				
			||||||
	;   chr_error(internal, 'Entailment Checker: try/2.\n', [])
 | 
					 | 
				
			||||||
	),
 | 
					 | 
				
			||||||
	(   test(B)
 | 
					 | 
				
			||||||
	->  fail
 | 
					 | 
				
			||||||
	;   true
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
add_args_unif([], [], true).
 | 
					 | 
				
			||||||
add_args_unif([A|C], [B|D], (A=B, E)) :-
 | 
					 | 
				
			||||||
	add_args_unif(C, D, E).
 | 
					 | 
				
			||||||
add_args_nunif([], [], fail).
 | 
					 | 
				
			||||||
add_args_nunif([A|C], [B|D], (A\=B;E)) :-
 | 
					 | 
				
			||||||
	add_args_nunif(C, D, E).
 | 
					 | 
				
			||||||
add_args_nmatch([], [], fail).
 | 
					 | 
				
			||||||
add_args_nmatch([A|C], [B|D], (A\==B;E)) :-
 | 
					 | 
				
			||||||
	add_args_nmatch(C, D, E).
 | 
					 | 
				
			||||||
all_unique_vars(A, B) :-
 | 
					 | 
				
			||||||
	all_unique_vars(A, B, []).
 | 
					 | 
				
			||||||
all_unique_vars([], _, _).
 | 
					 | 
				
			||||||
all_unique_vars([A|D], B, C) :-
 | 
					 | 
				
			||||||
	var(A),
 | 
					 | 
				
			||||||
	\+memberchk_eq(A, B),
 | 
					 | 
				
			||||||
	\+memberchk_eq(A, C),
 | 
					 | 
				
			||||||
	all_unique_vars(D, [A|C]).
 | 
					 | 
				
			||||||
:- chr_constraint'test/1_1_$default'/1, 'test/1_1_$special_,/2'/2, 'test/1_1_$special_\\+/1'/1, 'test/1_1_$special_integer/1'/1, 'test/1_1_$special_float/1'/1, 'test/1_1_$special_number/1'/1, 'test/1_1_$special_ground/1'/1, 'test/1_1_$special_=:=/2'/2, 'test/1_1_$special_==/2'/2, 'test/1_1_$special_true/0'/0, 'test/1_1_$special_functor/3'/3, 'test/1_1_$special_=/2'/2, 'test/1_1_$special_;/2'/2, 'test/1_1_$special_is/2'/2, 'test/1_1_$special_</2'/2, 'test/1_1_$special_>=/2'/2, 'test/1_1_$special_>/2'/2, 'test/1_1_$special_=\\=/2'/2, 'test/1_1_$special_=</2'/2, 'test/1_1_$special_\\==/2'/2, 'known/1_1_$default'/1, 'known/1_1_$special_;/2'/2, 'known/1_1_$special_nonvar/1'/1, 'known/1_1_$special_var/1'/1, 'known/1_1_$special_atom/1'/1, 'known/1_1_$special_atomic/1'/1, 'known/1_1_$special_compound/1'/1, 'known/1_1_$special_ground/1'/1, 'known/1_1_$special_integer/1'/1, 'known/1_1_$special_float/1'/1, 'known/1_1_$special_number/1'/1, 'known/1_1_$special_=\\=/2'/2, 'known/1_1_$special_\\+/1'/1, 'known/1_1_$special_functor/3'/3, 'known/1_1_$special_\\=/2'/2, 'known/1_1_$special_=/2'/2, 'known/1_1_$special_,/2'/2, 'known/1_1_$special_\\==/2'/2, 'known/1_1_$special_==/2'/2, 'known/1_1_$special_is/2'/2, 'known/1_1_$special_</2'/2, 'known/1_1_$special_>=/2'/2, 'known/1_1_$special_>/2'/2, 'known/1_1_$special_=</2'/2, 'known/1_1_$special_=:=/2'/2, 'known/1_1_$special_fail/0'/0.
 | 
					 | 
				
			||||||
test((A, B))<=>'test/1_1_$special_,/2'(A, B).
 | 
					 | 
				
			||||||
test(\+A)<=>'test/1_1_$special_\\+/1'(A).
 | 
					 | 
				
			||||||
test(integer(A))<=>'test/1_1_$special_integer/1'(A).
 | 
					 | 
				
			||||||
test(float(A))<=>'test/1_1_$special_float/1'(A).
 | 
					 | 
				
			||||||
test(number(A))<=>'test/1_1_$special_number/1'(A).
 | 
					 | 
				
			||||||
test(ground(A))<=>'test/1_1_$special_ground/1'(A).
 | 
					 | 
				
			||||||
test(A=:=B)<=>'test/1_1_$special_=:=/2'(A, B).
 | 
					 | 
				
			||||||
test(A==B)<=>'test/1_1_$special_==/2'(A, B).
 | 
					 | 
				
			||||||
test(true)<=>'test/1_1_$special_true/0'.
 | 
					 | 
				
			||||||
test(functor(A, B, C))<=>'test/1_1_$special_functor/3'(A, B, C).
 | 
					 | 
				
			||||||
test(A=B)<=>'test/1_1_$special_=/2'(A, B).
 | 
					 | 
				
			||||||
test((A;B))<=>'test/1_1_$special_;/2'(A, B).
 | 
					 | 
				
			||||||
test(A is B)<=>'test/1_1_$special_is/2'(A, B).
 | 
					 | 
				
			||||||
test(A<B)<=>'test/1_1_$special_</2'(A, B).
 | 
					 | 
				
			||||||
test(A>=B)<=>'test/1_1_$special_>=/2'(A, B).
 | 
					 | 
				
			||||||
test(A>B)<=>'test/1_1_$special_>/2'(A, B).
 | 
					 | 
				
			||||||
test(A=\=B)<=>'test/1_1_$special_=\\=/2'(A, B).
 | 
					 | 
				
			||||||
test(A=<B)<=>'test/1_1_$special_=</2'(A, B).
 | 
					 | 
				
			||||||
test(A\==B)<=>'test/1_1_$special_\\==/2'(A, B).
 | 
					 | 
				
			||||||
test(A)<=>'test/1_1_$default'(A).
 | 
					 | 
				
			||||||
known((A;B))<=>'known/1_1_$special_;/2'(A, B).
 | 
					 | 
				
			||||||
known(nonvar(A))<=>'known/1_1_$special_nonvar/1'(A).
 | 
					 | 
				
			||||||
known(var(A))<=>'known/1_1_$special_var/1'(A).
 | 
					 | 
				
			||||||
known(atom(A))<=>'known/1_1_$special_atom/1'(A).
 | 
					 | 
				
			||||||
known(atomic(A))<=>'known/1_1_$special_atomic/1'(A).
 | 
					 | 
				
			||||||
known(compound(A))<=>'known/1_1_$special_compound/1'(A).
 | 
					 | 
				
			||||||
known(ground(A))<=>'known/1_1_$special_ground/1'(A).
 | 
					 | 
				
			||||||
known(integer(A))<=>'known/1_1_$special_integer/1'(A).
 | 
					 | 
				
			||||||
known(float(A))<=>'known/1_1_$special_float/1'(A).
 | 
					 | 
				
			||||||
known(number(A))<=>'known/1_1_$special_number/1'(A).
 | 
					 | 
				
			||||||
known(A=\=B)<=>'known/1_1_$special_=\\=/2'(A, B).
 | 
					 | 
				
			||||||
known(\+A)<=>'known/1_1_$special_\\+/1'(A).
 | 
					 | 
				
			||||||
known(functor(A, B, C))<=>'known/1_1_$special_functor/3'(A, B, C).
 | 
					 | 
				
			||||||
known(A\=B)<=>'known/1_1_$special_\\=/2'(A, B).
 | 
					 | 
				
			||||||
known(A=B)<=>'known/1_1_$special_=/2'(A, B).
 | 
					 | 
				
			||||||
known((A, B))<=>'known/1_1_$special_,/2'(A, B).
 | 
					 | 
				
			||||||
known(A\==B)<=>'known/1_1_$special_\\==/2'(A, B).
 | 
					 | 
				
			||||||
known(A==B)<=>'known/1_1_$special_==/2'(A, B).
 | 
					 | 
				
			||||||
known(A is B)<=>'known/1_1_$special_is/2'(A, B).
 | 
					 | 
				
			||||||
known(A<B)<=>'known/1_1_$special_</2'(A, B).
 | 
					 | 
				
			||||||
known(A>=B)<=>'known/1_1_$special_>=/2'(A, B).
 | 
					 | 
				
			||||||
known(A>B)<=>'known/1_1_$special_>/2'(A, B).
 | 
					 | 
				
			||||||
known(A=<B)<=>'known/1_1_$special_=</2'(A, B).
 | 
					 | 
				
			||||||
known(A=:=B)<=>'known/1_1_$special_=:=/2'(A, B).
 | 
					 | 
				
			||||||
known(fail)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
known(A)<=>'known/1_1_$default'(A).
 | 
					 | 
				
			||||||
'known/1_1_$special_;/2'(A, B)\'known/1_1_$special_;/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_nonvar/1'(A)\'known/1_1_$special_nonvar/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_var/1'(A)\'known/1_1_$special_var/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_atom/1'(A)\'known/1_1_$special_atom/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_atomic/1'(A)\'known/1_1_$special_atomic/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_compound/1'(A)\'known/1_1_$special_compound/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_ground/1'(A)\'known/1_1_$special_ground/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_integer/1'(A)\'known/1_1_$special_integer/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_float/1'(A)\'known/1_1_$special_float/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_number/1'(A)\'known/1_1_$special_number/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=\\=/2'(A, B)\'known/1_1_$special_=\\=/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\+/1'(A)\'known/1_1_$special_\\+/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_functor/3'(A, B, C)\'known/1_1_$special_functor/3'(A, B, C)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\=/2'(A, B)\'known/1_1_$special_\\=/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=/2'(A, B)\'known/1_1_$special_=/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_,/2'(A, B)\'known/1_1_$special_,/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\==/2'(A, B)\'known/1_1_$special_\\==/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_==/2'(A, B)\'known/1_1_$special_==/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_is/2'(A, B)\'known/1_1_$special_is/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_</2'(A, B)\'known/1_1_$special_</2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_>=/2'(A, B)\'known/1_1_$special_>=/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_>/2'(A, B)\'known/1_1_$special_>/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(A, B)\'known/1_1_$special_=</2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=:=/2'(A, B)\'known/1_1_$special_=:=/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_fail/0'<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$default'(A)\'known/1_1_$default'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_,/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_\\+/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_integer/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_float/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_number/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_ground/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_=:=/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_==/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_true/0'<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_functor/3'(_, _, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_=/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_;/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_is/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_</2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_>=/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_>/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_=\\=/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_=</2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$special_\\==/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$default'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_;/2'(A, B)\'test/1_1_$special_;/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_nonvar/1'(A)\'test/1_1_$default'(nonvar(A))<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_var/1'(A)\'test/1_1_$default'(var(A))<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_atom/1'(A)\'test/1_1_$default'(atom(A))<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_atomic/1'(A)\'test/1_1_$default'(atomic(A))<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_compound/1'(A)\'test/1_1_$default'(compound(A))<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_ground/1'(A)\'test/1_1_$special_ground/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_integer/1'(A)\'test/1_1_$special_integer/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_float/1'(A)\'test/1_1_$special_float/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_number/1'(A)\'test/1_1_$special_number/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=\\=/2'(A, B)\'test/1_1_$special_=\\=/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\+/1'(A)\'test/1_1_$special_\\+/1'(A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_functor/3'(A, B, C)\'test/1_1_$special_functor/3'(A, B, C)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\=/2'(A, B)\'test/1_1_$default'(A\=B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=/2'(A, B)\'test/1_1_$special_=/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_,/2'(A, B)\'test/1_1_$special_,/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\==/2'(A, B)\'test/1_1_$special_\\==/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_==/2'(A, B)\'test/1_1_$special_==/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_is/2'(A, B)\'test/1_1_$special_is/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_</2'(A, B)\'test/1_1_$special_</2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_>=/2'(A, B)\'test/1_1_$special_>=/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_>/2'(A, B)\'test/1_1_$special_>/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(A, B)\'test/1_1_$special_=</2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=:=/2'(A, B)\'test/1_1_$special_=:=/2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'test/1_1_$default'(fail)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$default'(A)\'test/1_1_$default'(A)<=>true.
 | 
					 | 
				
			||||||
'test/1_1_$special_\\==/2'(F, A)<=>nonvar(A), functor(A, C, B)|A=..[_|E], length(D, B), G=..[C|D], add_args_nmatch(D, E, H), I= (\+functor(F, C, B);functor(F, C, B), F=G, H), test(I).
 | 
					 | 
				
			||||||
'test/1_1_$special_\\==/2'(A, B)<=>nonvar(A)|'test/1_1_$special_\\==/2'(B, A).
 | 
					 | 
				
			||||||
'known/1_1_$special_=:=/2'(A, B)\'test/1_1_$special_=</2'(A, B)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=:=/2'(A, C)\'test/1_1_$special_=</2'(A, B)<=>number(B), number(C), C=<B|true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=:=/2'(A, C)\'test/1_1_$special_=</2'(B, A)<=>number(B), number(C), B=<C|true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(A, C)\'test/1_1_$special_=</2'(A, B)<=>number(B), number(C), C=<B|true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(B, A)\'test/1_1_$special_=</2'(C, A)<=>number(B), number(C), C=<B|true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(A, C)\'test/1_1_$special_=\\=/2'(A, B)<=>number(B), number(C), B>C|true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(B, A)\'test/1_1_$special_=\\=/2'(A, C)<=>number(B), number(C), C<B|true.
 | 
					 | 
				
			||||||
'known/1_1_$special_>/2'(B, A)<=>'known/1_1_$special_</2'(A, B).
 | 
					 | 
				
			||||||
'known/1_1_$special_>=/2'(B, A)<=>'known/1_1_$special_=</2'(A, B).
 | 
					 | 
				
			||||||
'known/1_1_$special_</2'(A, B)<=>'known/1_1_$special_=</2'(A, B), 'known/1_1_$special_=\\=/2'(A, B).
 | 
					 | 
				
			||||||
'known/1_1_$special_is/2'(A, B)<=>'known/1_1_$special_=:=/2'(A, B).
 | 
					 | 
				
			||||||
'test/1_1_$special_>/2'(B, A)<=>'test/1_1_$special_</2'(A, B).
 | 
					 | 
				
			||||||
'test/1_1_$special_>=/2'(B, A)<=>'test/1_1_$special_=</2'(A, B).
 | 
					 | 
				
			||||||
'test/1_1_$special_</2'(A, B)<=>'test/1_1_$special_,/2'(A=<B, A=\=B).
 | 
					 | 
				
			||||||
'test/1_1_$special_is/2'(A, B)<=>'test/1_1_$special_=:=/2'(A, B).
 | 
					 | 
				
			||||||
'known/1_1_$special_==/2'(A, B)==>number(A)|'known/1_1_$special_=:=/2'(A, B).
 | 
					 | 
				
			||||||
'known/1_1_$special_==/2'(B, A)==>number(A)|'known/1_1_$special_=:=/2'(B, A).
 | 
					 | 
				
			||||||
'known/1_1_$special_\\==/2'(A, B)==>number(A)|'known/1_1_$special_=\\=/2'(A, B).
 | 
					 | 
				
			||||||
'known/1_1_$special_\\==/2'(B, A)==>number(A)|'known/1_1_$special_=\\=/2'(B, A).
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_;/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_nonvar/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_var/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_atom/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_atomic/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_compound/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_ground/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_integer/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_float/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_number/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_=\\=/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_\\+/1'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_functor/3'(_, _, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_\\=/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_=/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_,/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_\\==/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_==/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_is/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_</2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_>=/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_>/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_=</2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_=:=/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_fail/0'<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$default'(_)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_,/2'(A, B)<=>known(A), known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_=:=/2'(A, A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_==/2'(A, A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(A, A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=/2'(A, A)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=/2'(A, B)<=>var(A)|A=B.
 | 
					 | 
				
			||||||
'known/1_1_$special_=/2'(B, A)<=>var(A)|B=A.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\=/2'(A, B)<=>ground(A), ground(B), A=B|'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
variables(E), 'known/1_1_$special_functor/3'(A, B, C)<=>var(A), ground(B), ground(C)|functor(A, B, C), A=..[_|D], append(D, E, F), variables(F).
 | 
					 | 
				
			||||||
'known/1_1_$special_functor/3'(A, B, C)<=>nonvar(A), \+functor(A, B, C)|'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\+/1'(functor(A, B, C))<=>nonvar(A), functor(A, B, C)|'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_functor/3'(A, B, C), 'known/1_1_$special_functor/3'(A, D, E)<=>nonvar(B), nonvar(C), nonvar(D), nonvar(E)|'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\=/2'(A, A)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_=/2'(A, B)<=>nonvar(A), nonvar(B), functor(A, C, D)|functor(B, C, D), A=B->true;'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\=/2'(A, B)<=>var(A), nonvar(B), functor(B, D, C), C>0|length(E, C), B=..[D|F], G=..[D|E], add_args_nunif(F, E, H), I= (\+functor(A, D, C);A=G, H), known(I).
 | 
					 | 
				
			||||||
'known/1_1_$special_\\=/2'(A, B)<=>nonvar(A), nonvar(B), functor(A, C, D)|functor(B, C, D)->A=..[C|E], B=..[C|F], add_args_nunif(E, F, G), known(G);true.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\=/2'(B, A)==>'known/1_1_$special_\\=/2'(A, B).
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(A, B)<=>number(A), number(B), A>B|'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(A, B)\'known/1_1_$special_=</2'(A, C)<=>number(B), number(C), B=<C|true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(C, A)\'known/1_1_$special_=</2'(B, A)<=>number(B), number(C), B=<C|true.
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(B, A), 'known/1_1_$special_=</2'(A, B)<=>'known/1_1_$special_=:=/2'(B, A).
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(B, A), 'known/1_1_$special_=</2'(A, C)==>'known/1_1_$special_=</2'(B, C).
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(A, B), 'known/1_1_$special_=\\=/2'(A, B), 'known/1_1_$special_=</2'(B, C), 'known/1_1_$special_=\\=/2'(B, C)==>'known/1_1_$special_=\\=/2'(A, C).
 | 
					 | 
				
			||||||
'known/1_1_$special_=:=/2'(A, B)<=>number(A), number(B), A=\=B|'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_=\\=/2'(A, B)<=>number(A), number(B), A=:=B|'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_=\\=/2'(A, A)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_=:=/2'(A, B), 'known/1_1_$special_=\\=/2'(A, B)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_=:=/2'(B, A), 'known/1_1_$special_=:=/2'(A, C)==>B\==C|'known/1_1_$special_=:=/2'(B, C).
 | 
					 | 
				
			||||||
'known/1_1_$special_=:=/2'(B, A)==>'known/1_1_$special_=:=/2'(A, B).
 | 
					 | 
				
			||||||
'known/1_1_$special_=\\=/2'(B, A)==>'known/1_1_$special_=\\=/2'(A, B).
 | 
					 | 
				
			||||||
'known/1_1_$special_number/1'(A)<=>nonvar(A), \+number(A)|'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_float/1'(A)<=>nonvar(A), \+float(A)|'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_integer/1'(A)<=>nonvar(A), \+integer(A)|'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_integer/1'(A)==>'known/1_1_$special_number/1'(A).
 | 
					 | 
				
			||||||
'known/1_1_$special_float/1'(A)==>'known/1_1_$special_number/1'(A).
 | 
					 | 
				
			||||||
'known/1_1_$special_;/2'(A, B), 'known/1_1_$special_\\+/1'((A;B))<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_nonvar/1'(A), 'known/1_1_$special_\\+/1'(nonvar(A))<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_var/1'(A), 'known/1_1_$special_\\+/1'(var(A))<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_atom/1'(A), 'known/1_1_$special_\\+/1'(atom(A))<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_atomic/1'(A), 'known/1_1_$special_\\+/1'(atomic(A))<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_compound/1'(A), 'known/1_1_$special_\\+/1'(compound(A))<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_ground/1'(A), 'known/1_1_$special_\\+/1'(ground(A))<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_integer/1'(A), 'known/1_1_$special_\\+/1'(integer(A))<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_float/1'(A), 'known/1_1_$special_\\+/1'(float(A))<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_number/1'(A), 'known/1_1_$special_\\+/1'(number(A))<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_=\\=/2'(A, B), 'known/1_1_$special_\\+/1'(A=\=B)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\+/1'(A), 'known/1_1_$special_\\+/1'(\+A)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_functor/3'(A, B, C), 'known/1_1_$special_\\+/1'(functor(A, B, C))<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\=/2'(A, B), 'known/1_1_$special_\\+/1'(A\=B)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_=/2'(A, B), 'known/1_1_$special_\\+/1'(A=B)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_,/2'(A, B), 'known/1_1_$special_\\+/1'((A, B))<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\==/2'(A, B), 'known/1_1_$special_\\+/1'(A\==B)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_==/2'(A, B), 'known/1_1_$special_\\+/1'(A==B)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_is/2'(A, B), 'known/1_1_$special_\\+/1'(A is B)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_</2'(A, B), 'known/1_1_$special_\\+/1'(A<B)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_>=/2'(A, B), 'known/1_1_$special_\\+/1'(A>=B)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_>/2'(A, B), 'known/1_1_$special_\\+/1'(A>B)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(A, B), 'known/1_1_$special_\\+/1'(A=<B)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_=:=/2'(A, B), 'known/1_1_$special_\\+/1'(A=:=B)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0', 'known/1_1_$special_\\+/1'(fail)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$default'(A), 'known/1_1_$special_\\+/1'(A)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\==/2'(A, B), 'known/1_1_$special_==/2'(A, B)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_==/2'(B, A), 'known/1_1_$special_==/2'(A, C)==>'known/1_1_$special_==/2'(B, C).
 | 
					 | 
				
			||||||
'known/1_1_$special_==/2'(B, A), 'known/1_1_$special_\\==/2'(A, C)==>'known/1_1_$special_\\==/2'(B, C).
 | 
					 | 
				
			||||||
'known/1_1_$special_==/2'(B, A)==>'known/1_1_$special_==/2'(A, B).
 | 
					 | 
				
			||||||
'known/1_1_$special_\\==/2'(B, A)==>'known/1_1_$special_\\==/2'(A, B).
 | 
					 | 
				
			||||||
'known/1_1_$special_\\==/2'(A, A)==>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_\\==/2'(A, B)<=>nonvar(A), nonvar(B), functor(A, C, D)|functor(B, C, D)->A=..[C|E], B=..[C|F], add_args_nmatch(E, F, G), known(G);true.
 | 
					 | 
				
			||||||
'known/1_1_$special_==/2'(A, B)==>'known/1_1_$special_=/2'(A, B).
 | 
					 | 
				
			||||||
'known/1_1_$special_ground/1'(A)==>'known/1_1_$special_nonvar/1'(A).
 | 
					 | 
				
			||||||
'known/1_1_$special_compound/1'(A)==>'known/1_1_$special_nonvar/1'(A).
 | 
					 | 
				
			||||||
'known/1_1_$special_atomic/1'(A)==>'known/1_1_$special_nonvar/1'(A).
 | 
					 | 
				
			||||||
'known/1_1_$special_number/1'(A)==>'known/1_1_$special_nonvar/1'(A).
 | 
					 | 
				
			||||||
'known/1_1_$special_atom/1'(A)==>'known/1_1_$special_nonvar/1'(A).
 | 
					 | 
				
			||||||
'known/1_1_$special_var/1'(A), 'known/1_1_$special_nonvar/1'(A)<=>'known/1_1_$special_fail/0'.
 | 
					 | 
				
			||||||
'known/1_1_$special_;/2'(A, B)\'known/1_1_$special_;/2'(\+ (A;B), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_nonvar/1'(A)\'known/1_1_$special_;/2'(\+nonvar(A), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_var/1'(A)\'known/1_1_$special_;/2'(\+var(A), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_atom/1'(A)\'known/1_1_$special_;/2'(\+atom(A), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_atomic/1'(A)\'known/1_1_$special_;/2'(\+atomic(A), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_compound/1'(A)\'known/1_1_$special_;/2'(\+compound(A), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_ground/1'(A)\'known/1_1_$special_;/2'(\+ground(A), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_integer/1'(A)\'known/1_1_$special_;/2'(\+integer(A), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_float/1'(A)\'known/1_1_$special_;/2'(\+float(A), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_number/1'(A)\'known/1_1_$special_;/2'(\+number(A), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_=\\=/2'(A, B)\'known/1_1_$special_;/2'(\+A=\=B, C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_\\+/1'(A)\'known/1_1_$special_;/2'(\+ \+A, B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_functor/3'(A, B, C)\'known/1_1_$special_;/2'(\+functor(A, B, C), D)<=>known(D).
 | 
					 | 
				
			||||||
'known/1_1_$special_\\=/2'(A, B)\'known/1_1_$special_;/2'(\+A\=B, C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_=/2'(A, B)\'known/1_1_$special_;/2'(\+A=B, C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_,/2'(A, B)\'known/1_1_$special_;/2'(\+ (A, B), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_\\==/2'(A, B)\'known/1_1_$special_;/2'(\+A\==B, C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_==/2'(A, B)\'known/1_1_$special_;/2'(\+A==B, C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_is/2'(A, B)\'known/1_1_$special_;/2'(\+A is B, C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_</2'(A, B)\'known/1_1_$special_;/2'(\+A<B, C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_>=/2'(A, B)\'known/1_1_$special_;/2'(\+A>=B, C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_>/2'(A, B)\'known/1_1_$special_;/2'(\+A>B, C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(A, B)\'known/1_1_$special_;/2'(\+A=<B, C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_=:=/2'(A, B)\'known/1_1_$special_;/2'(\+A=:=B, C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_;/2'(\+fail, A)<=>known(A).
 | 
					 | 
				
			||||||
'known/1_1_$default'(A)\'known/1_1_$special_;/2'(\+A, B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_;/2'(A, B)\'known/1_1_$special_;/2'((\+ (A;B), _), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_nonvar/1'(A)\'known/1_1_$special_;/2'((\+nonvar(A), _), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_var/1'(A)\'known/1_1_$special_;/2'((\+var(A), _), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_atom/1'(A)\'known/1_1_$special_;/2'((\+atom(A), _), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_atomic/1'(A)\'known/1_1_$special_;/2'((\+atomic(A), _), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_compound/1'(A)\'known/1_1_$special_;/2'((\+compound(A), _), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_ground/1'(A)\'known/1_1_$special_;/2'((\+ground(A), _), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_integer/1'(A)\'known/1_1_$special_;/2'((\+integer(A), _), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_float/1'(A)\'known/1_1_$special_;/2'((\+float(A), _), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_number/1'(A)\'known/1_1_$special_;/2'((\+number(A), _), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_=\\=/2'(A, B)\'known/1_1_$special_;/2'((\+A=\=B, _), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_\\+/1'(A)\'known/1_1_$special_;/2'((\+ \+A, _), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_functor/3'(A, B, C)\'known/1_1_$special_;/2'((\+functor(A, B, C), _), D)<=>known(D).
 | 
					 | 
				
			||||||
'known/1_1_$special_\\=/2'(A, B)\'known/1_1_$special_;/2'((\+A\=B, _), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_=/2'(A, B)\'known/1_1_$special_;/2'((\+A=B, _), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_,/2'(A, B)\'known/1_1_$special_;/2'((\+ (A, B), _), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_\\==/2'(A, B)\'known/1_1_$special_;/2'((\+A\==B, _), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_==/2'(A, B)\'known/1_1_$special_;/2'((\+A==B, _), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_is/2'(A, B)\'known/1_1_$special_;/2'((\+A is B, _), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_</2'(A, B)\'known/1_1_$special_;/2'((\+A<B, _), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_>=/2'(A, B)\'known/1_1_$special_;/2'((\+A>=B, _), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_>/2'(A, B)\'known/1_1_$special_;/2'((\+A>B, _), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_=</2'(A, B)\'known/1_1_$special_;/2'((\+A=<B, _), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_=:=/2'(A, B)\'known/1_1_$special_;/2'((\+A=:=B, _), C)<=>known(C).
 | 
					 | 
				
			||||||
'known/1_1_$special_fail/0'\'known/1_1_$special_;/2'((\+fail, _), A)<=>known(A).
 | 
					 | 
				
			||||||
'known/1_1_$default'(A)\'known/1_1_$special_;/2'((\+A, _), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_\\+/1'(A)\'known/1_1_$special_;/2'(A, B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_\\+/1'(A)\'known/1_1_$special_;/2'((A, _), B)<=>known(B).
 | 
					 | 
				
			||||||
'known/1_1_$special_;/2'(fail, A)<=>known(A).
 | 
					 | 
				
			||||||
'known/1_1_$special_;/2'(A, fail)<=>known(A).
 | 
					 | 
				
			||||||
'known/1_1_$special_;/2'(true, _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_;/2'(_, true)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_functor/3'(A, _, _)\'known/1_1_$special_;/2'(\+functor(A, _, _), _)<=>true.
 | 
					 | 
				
			||||||
'known/1_1_$special_;/2'(\+functor(A, B, C), D)<=>nonvar(A), functor(A, B, C)|known(D).
 | 
					 | 
				
			||||||
'known/1_1_$special_;/2'(\+functor(A, B, C), _)<=>nonvar(A), \+functor(A, B, C)|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_;/2'(fail, A)<=>test(A).
 | 
					 | 
				
			||||||
'test/1_1_$special_;/2'(A, fail)<=>test(A).
 | 
					 | 
				
			||||||
% 'test/1_1_$special_=/2'(A, B)<=>A=B|A=B.
 | 
					 | 
				
			||||||
'test/1_1_$special_=/2'(A, B)<=>ground(A), ground(B)|A=B.
 | 
					 | 
				
			||||||
% 'test/1_1_$special_=/2'(A, B)<=>nonvar(A), var(B)|'test/1_1_$special_=/2'(B, A).
 | 
					 | 
				
			||||||
% variables(F)\'test/1_1_$special_=/2'(A, B)<=>var(A), nonvar(B), functor(B, D, C), C>0, B=..[D|E], \+all_unique_vars(E, F)|G= (functor(A, D, C), A=B), test(G).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
% variables(F) \ 'test/1_1_$special_=/2'(A, B) <=> 
 | 
					 | 
				
			||||||
% 		var(A), 
 | 
					 | 
				
			||||||
% 		nonvar(B), 
 | 
					 | 
				
			||||||
% 		\+ memberchk_eq(A,F),
 | 
					 | 
				
			||||||
% 		functor(B, C, D), 
 | 
					 | 
				
			||||||
% 		B=..[C|_]
 | 
					 | 
				
			||||||
% 	|
 | 
					 | 
				
			||||||
% 		E=functor(A, C, D), 
 | 
					 | 
				
			||||||
% 		test(E).
 | 
					 | 
				
			||||||
% 'test/1_1_$special_=/2'(A, B)<=>nonvar(A), nonvar(B), functor(B, C, D), B=..[C|F]|functor(A, C, D), A=..[C|E], add_args_unif(E, F, G), test(G).
 | 
					 | 
				
			||||||
variables(D)\'test/1_1_$special_functor/3'(A, B, C)<=>var(A), ground(B), ground(C), \+memberchk_eq(A, D)|functor(A, B, C).
 | 
					 | 
				
			||||||
'test/1_1_$special_true/0'<=>true.
 | 
					 | 
				
			||||||
'test/1_1_$special_==/2'(A, B)<=>A==B|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_=:=/2'(A, B)<=>A==B|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_=</2'(A, B)<=>A==B|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_=</2'(A, B)<=>ground(A), ground(B), A=<B|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_=</2'(A, B)<=>ground(A), ground(B), A>B|fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_=:=/2'(A, B)<=>ground(A), ground(B), A=:=B|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_=:=/2'(A, B)<=>ground(A), ground(B), A=\=B|fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_=\\=/2'(A, B)<=>ground(A), ground(B), A=\=B|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_=\\=/2'(A, B)<=>ground(A), ground(B), A=:=B|fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_functor/3'(A, B, C)<=>nonvar(A), functor(A, B, C)|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_functor/3'(A, _, _)<=>nonvar(A)|fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_ground/1'(A)<=>ground(A)|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_number/1'(A)<=>number(A)|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_float/1'(A)<=>float(A)|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_integer/1'(A)<=>integer(A)|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_number/1'(A)<=>nonvar(A)|fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_float/1'(A)<=>nonvar(A)|fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_integer/1'(A)<=>nonvar(A)|fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_\\+/1'(functor(A, B, C))<=>nonvar(A), functor(A, B, C)|fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_\\+/1'(functor(A, _, _))<=>nonvar(A)|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_\\+/1'(ground(A))<=>ground(A)|fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_\\+/1'(number(A))<=>number(A)|fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_\\+/1'(float(A))<=>float(A)|fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_\\+/1'(integer(A))<=>integer(A)|fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_\\+/1'(number(A))<=>nonvar(A)|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_\\+/1'(float(A))<=>nonvar(A)|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_\\+/1'(integer(A))<=>nonvar(A)|true.
 | 
					 | 
				
			||||||
'test/1_1_$special_,/2'(A, B)<=>test(A), known(A), test(B).
 | 
					 | 
				
			||||||
'test/1_1_$special_;/2'(A, B)<=>true|negate_b(A, D), negate_b(B, C), (known(C), test(A);known(D), test(B)).
 | 
					 | 
				
			||||||
'test/1_1_$special_,/2'(B, C), 'known/1_1_$special_;/2'(A, E)<=>true|\+try(A, (B, C)), !, negate_b(A, D), known(D), \+try(E, (B, C)).
 | 
					 | 
				
			||||||
'test/1_1_$special_\\+/1'(B), 'known/1_1_$special_;/2'(A, D)<=>true|\+try(A, \+B), !, negate_b(A, C), known(C), \+try(D, \+B).
 | 
					 | 
				
			||||||
'test/1_1_$special_integer/1'(B), 'known/1_1_$special_;/2'(A, D)<=>true|\+try(A, integer(B)), !, negate_b(A, C), known(C), \+try(D, integer(B)).
 | 
					 | 
				
			||||||
'test/1_1_$special_float/1'(B), 'known/1_1_$special_;/2'(A, D)<=>true|\+try(A, float(B)), !, negate_b(A, C), known(C), \+try(D, float(B)).
 | 
					 | 
				
			||||||
'test/1_1_$special_number/1'(B), 'known/1_1_$special_;/2'(A, D)<=>true|\+try(A, number(B)), !, negate_b(A, C), known(C), \+try(D, number(B)).
 | 
					 | 
				
			||||||
'test/1_1_$special_ground/1'(B), 'known/1_1_$special_;/2'(A, D)<=>true|\+try(A, ground(B)), !, negate_b(A, C), known(C), \+try(D, ground(B)).
 | 
					 | 
				
			||||||
'test/1_1_$special_=:=/2'(B, C), 'known/1_1_$special_;/2'(A, E)<=>true|\+try(A, B=:=C), !, negate_b(A, D), known(D), \+try(E, B=:=C).
 | 
					 | 
				
			||||||
'test/1_1_$special_==/2'(B, C), 'known/1_1_$special_;/2'(A, E)<=>true|\+try(A, B==C), !, negate_b(A, D), known(D), \+try(E, B==C).
 | 
					 | 
				
			||||||
'test/1_1_$special_true/0', 'known/1_1_$special_;/2'(A, C)<=>true|\+try(A, true), !, negate_b(A, B), known(B), \+try(C, true).
 | 
					 | 
				
			||||||
'test/1_1_$special_functor/3'(B, C, D), 'known/1_1_$special_;/2'(A, F)<=>true|\+try(A, functor(B, C, D)), !, negate_b(A, E), known(E), \+try(F, functor(B, C, D)).
 | 
					 | 
				
			||||||
'test/1_1_$special_=/2'(B, C), 'known/1_1_$special_;/2'(A, E)<=>true|\+try(A, B=C), !, negate_b(A, D), known(D), \+try(E, B=C).
 | 
					 | 
				
			||||||
'test/1_1_$special_;/2'(B, C), 'known/1_1_$special_;/2'(A, E)<=>true|\+try(A, (B;C)), !, negate_b(A, D), known(D), \+try(E, (B;C)).
 | 
					 | 
				
			||||||
'test/1_1_$special_is/2'(B, C), 'known/1_1_$special_;/2'(A, E)<=>true|\+try(A, B is C), !, negate_b(A, D), known(D), \+try(E, B is C).
 | 
					 | 
				
			||||||
'test/1_1_$special_</2'(B, C), 'known/1_1_$special_;/2'(A, E)<=>true|\+try(A, B<C), !, negate_b(A, D), known(D), \+try(E, B<C).
 | 
					 | 
				
			||||||
'test/1_1_$special_>=/2'(B, C), 'known/1_1_$special_;/2'(A, E)<=>true|\+try(A, B>=C), !, negate_b(A, D), known(D), \+try(E, B>=C).
 | 
					 | 
				
			||||||
'test/1_1_$special_>/2'(B, C), 'known/1_1_$special_;/2'(A, E)<=>true|\+try(A, B>C), !, negate_b(A, D), known(D), \+try(E, B>C).
 | 
					 | 
				
			||||||
'test/1_1_$special_=\\=/2'(B, C), 'known/1_1_$special_;/2'(A, E)<=>true|\+try(A, B=\=C), !, negate_b(A, D), known(D), \+try(E, B=\=C).
 | 
					 | 
				
			||||||
'test/1_1_$special_=</2'(B, C), 'known/1_1_$special_;/2'(A, E)<=>true|\+try(A, B=<C), !, negate_b(A, D), known(D), \+try(E, B=<C).
 | 
					 | 
				
			||||||
'test/1_1_$special_\\==/2'(B, C), 'known/1_1_$special_;/2'(A, E)<=>true|\+try(A, B\==C), !, negate_b(A, D), known(D), \+try(E, B\==C).
 | 
					 | 
				
			||||||
'test/1_1_$default'(B), 'known/1_1_$special_;/2'(A, D)<=>true|\+try(A, B), !, negate_b(A, C), known(C), \+try(D, B).
 | 
					 | 
				
			||||||
'test/1_1_$special_,/2'(_, _)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_\\+/1'(_)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_integer/1'(_)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_float/1'(_)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_number/1'(_)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_ground/1'(_)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_=:=/2'(_, _)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_==/2'(_, _)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_true/0'<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_functor/3'(_, _, _)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_=/2'(_, _)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_;/2'(_, _)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_is/2'(_, _)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_</2'(_, _)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_>=/2'(_, _)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_>/2'(_, _)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_=\\=/2'(_, _)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_=</2'(_, _)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$special_\\==/2'(_, _)<=>fail.
 | 
					 | 
				
			||||||
'test/1_1_$default'(_)<=>fail.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_;/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_nonvar/1'(_)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_var/1'(_)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_atom/1'(_)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_atomic/1'(_)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_compound/1'(_)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_ground/1'(_)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_integer/1'(_)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_float/1'(_)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_number/1'(_)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_=\\=/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_\\+/1'(_)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_functor/3'(_, _, _)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_\\=/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_=/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_,/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_\\==/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_==/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_is/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_</2'(_, _)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_>=/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_>/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_=</2'(_, _)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_=:=/2'(_, _)<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$special_fail/0'<=>true.
 | 
					 | 
				
			||||||
cleanup\'known/1_1_$default'(_)<=>true.
 | 
					 | 
				
			||||||
cleanup\variables(_)<=>true.
 | 
					 | 
				
			||||||
cleanup<=>true.
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,192 +0,0 @@
 | 
				
			|||||||
:- module(hprolog,
 | 
					 | 
				
			||||||
	  [ substitute_eq/4,		% +OldVal, +OldList, +NewVal, -NewList
 | 
					 | 
				
			||||||
	    memberchk_eq/2,		% +Val, +List
 | 
					 | 
				
			||||||
	    intersect_eq/3,		% +List1, +List2, -Intersection
 | 
					 | 
				
			||||||
	    list_difference_eq/3,	% +List, -Subtract, -Rest
 | 
					 | 
				
			||||||
	    take/3,			% +N, +List, -FirstElements
 | 
					 | 
				
			||||||
	    drop/3,			% +N, +List, -LastElements
 | 
					 | 
				
			||||||
	    split_at/4,			% +N, +List, -FirstElements, -LastElements
 | 
					 | 
				
			||||||
	    max_go_list/2,		% +List, -Max
 | 
					 | 
				
			||||||
	    or_list/2,			% +ListOfInts, -BitwiseOr
 | 
					 | 
				
			||||||
	    sublist/2,			% ?Sublist, +List
 | 
					 | 
				
			||||||
	    bounded_sublist/3,		% ?Sublist, +List, +Bound
 | 
					 | 
				
			||||||
	    chr_delete/3,
 | 
					 | 
				
			||||||
	    init_store/2,
 | 
					 | 
				
			||||||
	    get_store/2,
 | 
					 | 
				
			||||||
	    update_store/2,
 | 
					 | 
				
			||||||
	    make_get_store_goal/3,
 | 
					 | 
				
			||||||
	    make_update_store_goal/3,
 | 
					 | 
				
			||||||
	    make_init_store_goal/3,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	    empty_ds/1,
 | 
					 | 
				
			||||||
	    ds_to_list/2,
 | 
					 | 
				
			||||||
	    get_ds/3,
 | 
					 | 
				
			||||||
	    put_ds/4
 | 
					 | 
				
			||||||
%	    lookup_ht1/4
 | 
					 | 
				
			||||||
	  ]).
 | 
					 | 
				
			||||||
:- use_module(library(lists)).
 | 
					 | 
				
			||||||
:- use_module(library(assoc)).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
empty_ds(DS) :- empty_assoc(DS).
 | 
					 | 
				
			||||||
ds_to_list(DS,LIST) :- assoc_to_list(DS,LIST).
 | 
					 | 
				
			||||||
get_ds(A,B,C) :- get_assoc(A,B,C).
 | 
					 | 
				
			||||||
put_ds(A,B,C,D) :- put_assoc(A,B,C,D).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
init_store(Name,Value) :- nb_setval(Name,Value).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
get_store(Name,Value) :- nb_getval(Name,Value).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
update_store(Name,Value) :- b_setval(Name,Value).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
make_init_store_goal(Name,Value,Goal) :- Goal = nb_setval(Name,Value).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
make_get_store_goal(Name,Value,Goal) :- Goal = nb_getval(Name,Value).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
make_update_store_goal(Name,Value,Goal) :- Goal = b_setval(Name,Value).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		 /*******************************
 | 
					 | 
				
			||||||
		 *      MORE LIST OPERATIONS	*
 | 
					 | 
				
			||||||
		 *******************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	substitute_eq(+OldVal, +OldList, +NewVal, -NewList)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Substitute OldVal by NewVal in OldList and unify the result
 | 
					 | 
				
			||||||
%	with NewList.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
substitute_eq(_, [], _, []) :- ! .
 | 
					 | 
				
			||||||
substitute_eq(X, [U|Us], Y, [V|Vs]) :-
 | 
					 | 
				
			||||||
        (   X == U
 | 
					 | 
				
			||||||
	->  V = Y,
 | 
					 | 
				
			||||||
            substitute_eq(X, Us, Y, Vs)
 | 
					 | 
				
			||||||
        ;   V = U,
 | 
					 | 
				
			||||||
            substitute_eq(X, Us, Y, Vs)
 | 
					 | 
				
			||||||
        ).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	memberchk_eq(+Val, +List)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Deterministic check of membership using == rather than
 | 
					 | 
				
			||||||
%	unification.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
memberchk_eq(X, [Y|Ys]) :-
 | 
					 | 
				
			||||||
   (   X == Y
 | 
					 | 
				
			||||||
   ->  true
 | 
					 | 
				
			||||||
   ;   memberchk_eq(X, Ys)
 | 
					 | 
				
			||||||
   ).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
% :- load_foreign_library(chr_support).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	list_difference_eq(+List, -Subtract, -Rest)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Delete all elements of Subtract from List and unify the result
 | 
					 | 
				
			||||||
%	with Rest.  Element comparision is done using ==/2.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
list_difference_eq([],_,[]).
 | 
					 | 
				
			||||||
list_difference_eq([X|Xs],Ys,L) :-
 | 
					 | 
				
			||||||
	(   memberchk_eq(X,Ys)
 | 
					 | 
				
			||||||
	->  list_difference_eq(Xs,Ys,L)
 | 
					 | 
				
			||||||
	;   L = [X|T],
 | 
					 | 
				
			||||||
	    list_difference_eq(Xs,Ys,T)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	intersect_eq(+List1, +List2, -Intersection)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Determine the intersection of two lists without unifying values.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
intersect_eq([], _, []).
 | 
					 | 
				
			||||||
intersect_eq([X|Xs], Ys, L) :-
 | 
					 | 
				
			||||||
	(   memberchk_eq(X, Ys)
 | 
					 | 
				
			||||||
	->  L = [X|T],
 | 
					 | 
				
			||||||
	    intersect_eq(Xs, Ys, T)
 | 
					 | 
				
			||||||
	;   intersect_eq(Xs, Ys, L)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	take(+N, +List, -FirstElements)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Take the first  N  elements  from   List  and  unify  this  with
 | 
					 | 
				
			||||||
%	FirstElements. The definition is based   on the GNU-Prolog lists
 | 
					 | 
				
			||||||
%	library. Implementation by Jan Wielemaker.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
take(0, _, []) :- !.
 | 
					 | 
				
			||||||
take(N, [H|TA], [H|TB]) :-
 | 
					 | 
				
			||||||
	N > 0,
 | 
					 | 
				
			||||||
	N2 is N - 1,
 | 
					 | 
				
			||||||
	take(N2, TA, TB).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	Drop the first  N  elements  from   List  and  unify  the remainder  with
 | 
					 | 
				
			||||||
%	LastElements.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
drop(0,LastElements,LastElements) :- !.
 | 
					 | 
				
			||||||
drop(N,[_|Tail],LastElements) :-
 | 
					 | 
				
			||||||
	N > 0,
 | 
					 | 
				
			||||||
	N1 is N  - 1,
 | 
					 | 
				
			||||||
	drop(N1,Tail,LastElements).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
split_at(0,L,[],L) :- !.
 | 
					 | 
				
			||||||
split_at(N,[H|T],[H|L1],L2) :-
 | 
					 | 
				
			||||||
	M is N -1,
 | 
					 | 
				
			||||||
	split_at(M,T,L1,L2).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	max_go_list(+List, -Max)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Return the maximum of List in the standard order of terms.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
max_go_list([H|T], Max) :-
 | 
					 | 
				
			||||||
	max_go_list(T, H, Max).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
max_go_list([], Max, Max).
 | 
					 | 
				
			||||||
max_go_list([H|T], X, Max) :-
 | 
					 | 
				
			||||||
        (   H @=< X
 | 
					 | 
				
			||||||
	->  max_go_list(T, X, Max)
 | 
					 | 
				
			||||||
        ;   max_go_list(T, H, Max)
 | 
					 | 
				
			||||||
        ).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%	or_list(+ListOfInts, -BitwiseOr)
 | 
					 | 
				
			||||||
%	
 | 
					 | 
				
			||||||
%	Do a bitwise disjuction over all integer members of ListOfInts.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
or_list(L, Or) :-
 | 
					 | 
				
			||||||
	or_list(L, 0, Or).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
or_list([], Or, Or).
 | 
					 | 
				
			||||||
or_list([H|T], Or0, Or) :-
 | 
					 | 
				
			||||||
	Or1 is H \/ Or0,
 | 
					 | 
				
			||||||
	or_list(T, Or1, Or).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
sublist(L, L).
 | 
					 | 
				
			||||||
sublist(Sub, [H|T]) :-
 | 
					 | 
				
			||||||
	'$sublist1'(T, H, Sub).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
'$sublist1'(Sub, _, Sub).
 | 
					 | 
				
			||||||
'$sublist1'([H|T], _, Sub) :-
 | 
					 | 
				
			||||||
	'$sublist1'(T, H, Sub).
 | 
					 | 
				
			||||||
'$sublist1'([H|T], X, [X|Sub]) :-
 | 
					 | 
				
			||||||
	'$sublist1'(T, H, Sub).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bounded_sublist(Sublist,_,_) :-
 | 
					 | 
				
			||||||
	Sublist = [].
 | 
					 | 
				
			||||||
bounded_sublist(Sublist,[H|List],Bound) :-
 | 
					 | 
				
			||||||
	Bound > 0,
 | 
					 | 
				
			||||||
	(
 | 
					 | 
				
			||||||
		Sublist = [H|Rest],
 | 
					 | 
				
			||||||
		NBound is Bound - 1,
 | 
					 | 
				
			||||||
		bounded_sublist(Rest,List,NBound)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		bounded_sublist(Sublist,List,Bound)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
chr_delete([], _, []).
 | 
					 | 
				
			||||||
chr_delete([H|T], X, L) :-
 | 
					 | 
				
			||||||
        (   H==X ->
 | 
					 | 
				
			||||||
            chr_delete(T, X, L)
 | 
					 | 
				
			||||||
        ;   L=[H|RT],
 | 
					 | 
				
			||||||
            chr_delete(T, X, RT)
 | 
					 | 
				
			||||||
        ).
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
@@ -1,105 +0,0 @@
 | 
				
			|||||||
/*  $Id: listmap.pl,v 1.3 2008-03-13 14:38:01 vsc Exp $
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Part of CHR (Constraint Handling Rules)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Author:        Tom Schrijvers
 | 
					 | 
				
			||||||
    E-mail:        Tom.Schrijvers@cs.kuleuven.be
 | 
					 | 
				
			||||||
    WWW:           http://www.swi-prolog.org
 | 
					 | 
				
			||||||
    Copyright (C): 2003-2004, K.U. Leuven
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is free software; you can redistribute it and/or
 | 
					 | 
				
			||||||
    modify it under the terms of the GNU General Public License
 | 
					 | 
				
			||||||
    as published by the Free Software Foundation; either version 2
 | 
					 | 
				
			||||||
    of the License, or (at your option) any later version.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
    GNU General Public License for more details.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    You should have received a copy of the GNU Lesser General Public
 | 
					 | 
				
			||||||
    License along with this library; if not, write to the Free Software
 | 
					 | 
				
			||||||
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    As a special exception, if you link this library with other files,
 | 
					 | 
				
			||||||
    compiled with a Free Software compiler, to produce an executable, this
 | 
					 | 
				
			||||||
    library does not by itself cause the resulting executable to be covered
 | 
					 | 
				
			||||||
    by the GNU General Public License. This exception does not however
 | 
					 | 
				
			||||||
    invalidate any other reasons why the executable file might be covered by
 | 
					 | 
				
			||||||
    the GNU General Public License.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- module(listmap,
 | 
					 | 
				
			||||||
	[
 | 
					 | 
				
			||||||
		listmap_empty/1,
 | 
					 | 
				
			||||||
		listmap_lookup/3,
 | 
					 | 
				
			||||||
		listmap_insert/4,
 | 
					 | 
				
			||||||
		listmap_remove/3,
 | 
					 | 
				
			||||||
		listmap_merge/5
 | 
					 | 
				
			||||||
	]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
listmap_empty([]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
listmap_lookup([K-V|R],Key,Q) :-
 | 
					 | 
				
			||||||
	( Key == K ->
 | 
					 | 
				
			||||||
		Q = V
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		Key @> K,
 | 
					 | 
				
			||||||
		listmap_lookup(R,Key,Q)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
listmap_insert([],Key,Value,[Key-Value]).
 | 
					 | 
				
			||||||
listmap_insert([P|R],Key,Value,ML) :-
 | 
					 | 
				
			||||||
	P = K-_,
 | 
					 | 
				
			||||||
	compare(C,Key,K),
 | 
					 | 
				
			||||||
	( C == (=) ->
 | 
					 | 
				
			||||||
		ML = [K-Value|R]
 | 
					 | 
				
			||||||
	; C == (<) ->
 | 
					 | 
				
			||||||
		ML = [Key-Value,P|R]
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		ML = [P|Tail],
 | 
					 | 
				
			||||||
		listmap_insert(R,Key,Value,Tail)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
listmap_merge(ML1,ML2,F,G,ML) :-
 | 
					 | 
				
			||||||
	( ML1 == [] ->
 | 
					 | 
				
			||||||
		ML = ML2
 | 
					 | 
				
			||||||
	; ML2 == [] ->
 | 
					 | 
				
			||||||
		ML = ML1
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		ML1 = [P1|R1], P1 = K1-V1,
 | 
					 | 
				
			||||||
		ML2 = [P2|R2], P2 = K2-V2,
 | 
					 | 
				
			||||||
		compare(C,K1,K2),
 | 
					 | 
				
			||||||
		( C == (=) ->
 | 
					 | 
				
			||||||
			Call =.. [F,V1,V2,NV],
 | 
					 | 
				
			||||||
			call(Call),
 | 
					 | 
				
			||||||
			ML = [K1-NV|Tail],
 | 
					 | 
				
			||||||
			listmap_merge(R1,R2,F,G,Tail)
 | 
					 | 
				
			||||||
		; C == (<) ->
 | 
					 | 
				
			||||||
			Call =.. [G,V1,NV],
 | 
					 | 
				
			||||||
			call(Call),
 | 
					 | 
				
			||||||
			ML = [K1-NV|Tail],
 | 
					 | 
				
			||||||
			listmap_merge(R1,ML2,F,G,Tail)
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
			Call =.. [G,V2,NV],
 | 
					 | 
				
			||||||
			call(Call),
 | 
					 | 
				
			||||||
			ML = [K2-NV|Tail],
 | 
					 | 
				
			||||||
			listmap_merge(ML1,R2,F,G,Tail)
 | 
					 | 
				
			||||||
		)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
listmap_remove([],_,[]).
 | 
					 | 
				
			||||||
listmap_remove([P|R],Key,NLM) :-
 | 
					 | 
				
			||||||
	P = K-_,
 | 
					 | 
				
			||||||
	compare(C,Key,K),
 | 
					 | 
				
			||||||
	( C == (=) ->
 | 
					 | 
				
			||||||
		NLM = R
 | 
					 | 
				
			||||||
	; C == (<) ->
 | 
					 | 
				
			||||||
		NLM = [P|R]
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		NLM = [P|Tail],
 | 
					 | 
				
			||||||
		listmap_remove(R,Key,Tail)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
@@ -1,106 +0,0 @@
 | 
				
			|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | 
					 | 
				
			||||||
%%              _      _ _     _   
 | 
					 | 
				
			||||||
%%  _ __   __ _(_)_ __| (_)___| |_ 
 | 
					 | 
				
			||||||
%% | '_ \ / _` | | '__| | / __| __|
 | 
					 | 
				
			||||||
%% | |_) | (_| | | |  | | \__ \ |_ 
 | 
					 | 
				
			||||||
%% | .__/ \__,_|_|_|  |_|_|___/\__|
 | 
					 | 
				
			||||||
%% |_|                            
 | 
					 | 
				
			||||||
%%
 | 
					 | 
				
			||||||
%% * author: Tom Schrijvers
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:- module(pairlist,[
 | 
					 | 
				
			||||||
		fst_of_pairs/2,
 | 
					 | 
				
			||||||
		lookup/3,
 | 
					 | 
				
			||||||
		lookup_any/3,
 | 
					 | 
				
			||||||
		lookup_eq/3,
 | 
					 | 
				
			||||||
		lookup_any_eq/3,
 | 
					 | 
				
			||||||
		pairup/3,
 | 
					 | 
				
			||||||
		snd_of_pairs/2,
 | 
					 | 
				
			||||||
		translate/3,
 | 
					 | 
				
			||||||
		pairlist_delete_eq/3
 | 
					 | 
				
			||||||
	]).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
fst_of_pairs([],[]).
 | 
					 | 
				
			||||||
fst_of_pairs([X-_|XYs],[X|Xs]) :-
 | 
					 | 
				
			||||||
	fst_of_pairs(XYs,Xs).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
snd_of_pairs([],[]).
 | 
					 | 
				
			||||||
snd_of_pairs([_-Y|XYs],[Y|Ys]) :-
 | 
					 | 
				
			||||||
	snd_of_pairs(XYs,Ys).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pairup([],[],[]).
 | 
					 | 
				
			||||||
pairup([X|Xs],[Y|Ys],[X-Y|XYs]) :-
 | 
					 | 
				
			||||||
	pairup(Xs,Ys,XYs).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
lookup([K - V | KVs],Key,Value) :-
 | 
					 | 
				
			||||||
	( K = Key ->
 | 
					 | 
				
			||||||
		V = Value
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		lookup(KVs,Key,Value)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
lookup_any([K - V | KVs],Key,Value) :-
 | 
					 | 
				
			||||||
	( 
 | 
					 | 
				
			||||||
		K = Key,
 | 
					 | 
				
			||||||
		V = Value
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		lookup_any(KVs,Key,Value)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
lookup_eq([K - V | KVs],Key,Value) :-
 | 
					 | 
				
			||||||
	( K == Key ->
 | 
					 | 
				
			||||||
		V = Value
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		lookup_eq(KVs,Key,Value)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
lookup_any_eq([K - V | KVs],Key,Value) :-
 | 
					 | 
				
			||||||
	( 
 | 
					 | 
				
			||||||
		K == Key,
 | 
					 | 
				
			||||||
		V = Value
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		lookup_any_eq(KVs,Key,Value)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
translate([],_,[]).
 | 
					 | 
				
			||||||
translate([X|Xs],Dict,[Y|Ys]) :-
 | 
					 | 
				
			||||||
	lookup_eq(Dict,X,Y),
 | 
					 | 
				
			||||||
	translate(Xs,Dict,Ys).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pairlist_delete([], _, []).
 | 
					 | 
				
			||||||
pairlist_delete([K - V| KVs], Key, PL) :-
 | 
					 | 
				
			||||||
	( Key = K ->
 | 
					 | 
				
			||||||
		PL = KVs
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		PL = [ K - V | T ],
 | 
					 | 
				
			||||||
		pairlist_delete(KVs, Key, T)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pairlist_delete_all([], _, []).
 | 
					 | 
				
			||||||
pairlist_delete_all([K - V| KVs], Key, PL) :-
 | 
					 | 
				
			||||||
	( Key = K ->
 | 
					 | 
				
			||||||
		pairlist_delete_all(KVs, Key, PL)
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		PL = [ K - V | T ],
 | 
					 | 
				
			||||||
		pairlist_delete_all(KVs, Key, T)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pairlist_delete_eq([], _, []).
 | 
					 | 
				
			||||||
pairlist_delete_eq([K - V| KVs], Key, PL) :-
 | 
					 | 
				
			||||||
	( Key == K ->
 | 
					 | 
				
			||||||
		PL = KVs
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		PL = [ K - V | T ],
 | 
					 | 
				
			||||||
		pairlist_delete_eq(KVs, Key, T)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pairlist_delete_all_eq([], _, []).
 | 
					 | 
				
			||||||
pairlist_delete_all_eq([K - V| KVs], Key, PL) :-
 | 
					 | 
				
			||||||
	( Key == K ->
 | 
					 | 
				
			||||||
		pairlist_delete_all_eq(KVs, Key, PL)
 | 
					 | 
				
			||||||
	;
 | 
					 | 
				
			||||||
		PL = [ K - V | T ],
 | 
					 | 
				
			||||||
		pairlist_delete_all_eq(KVs, Key, T)
 | 
					 | 
				
			||||||
	).
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user