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