stop using submodule
This commit is contained in:
139
packages/chr/Benchmarks/fulladder.chr
Normal file
139
packages/chr/Benchmarks/fulladder.chr
Normal file
@@ -0,0 +1,139 @@
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%%
|
||||
%% 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]).
|
||||
:- use_module(library(chr)).
|
||||
|
||||
:- 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).
|
||||
|
||||
Reference in New Issue
Block a user