140 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			140 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
|  | %% | ||
|  | %% 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). | ||
|  | 
 |