Sophie

Sophie

distrib > Mandriva > 9.1 > ppc > by-pkgid > d1f06a5336fd6bf4a381b72b8d2b5ce1 > files > 50

gprolog-1.2.16-3mdk.ppc.rpm

/*-------------------------------------------------------------------------*/
/* Benchmark (Boolean)                                                     */
/*                                                                         */
/* Name           : bdonald.pl                                             */
/* Title          : crypt-arithmetic                                       */
/* Original Source: Daniel Diaz - INRIA France                             */
/* Adapted by     : Daniel Diaz for GNU Prolog                             */
/* Date           : January 1993                                           */
/*                                                                         */
/* Solve the operation:                                                    */
/*                                                                         */
/*    D O N A L D                                                          */
/*  + G E R A L D                                                          */
/*  --------------                                                         */
/*  = R O B E R T                                                          */
/*                                                                         */
/* (resolution by column)                                                  */
/* The digit of each letter is coded in binary on 4 bits (dcb). The order  */
/* for labeling is very relevant for efficiency.                           */
/*                                                                         */
/* Solution:                                                               */
/*  [D,O,N,A,L,G,E,R,B,T]                                                  */
/*  [5,2,6,4,8,1,9,7,3,0]                                                  */
/*  [[0,1,0,1],[0,0,1,0],[0,1,1,0],[0,1,0,0],[1,0,0,0],[0,0,0,1],[1,0,0,1],*/
/*   [0,1,1,1],[0,0,1,1],[0,0,0,0]]                                        */
/* ie:                                                                     */
/*  [5,2,6,4,8,1,9,7,3,0]                                                  */
/*-------------------------------------------------------------------------*/

q:-	statistics(runtime,_),
	(bdonald(A), 
	 write(A), nl,
	 fail
	   ; 
   	 write('No more solutions'), nl),
	statistics(runtime,[_,Y]),
	write('time : '), write(Y), nl.




bdonald(Ar):- 
	Ar=[D,O,N,A,L,G,E,R,B,T],
	dcb_digit(D),
	dcb_digit(O),
	dcb_digit(N),
	dcb_digit(A),
	dcb_digit(L),
	dcb_digit(G),
	dcb_digit(E),
	dcb_digit(R),
	dcb_digit(B),
	dcb_digit(T),

	diff0(D),
	diff0(G),

	all_dcb_digit_diff(Ar),

	LC=[C1,C2,C3,C4,C5],
	dcb_add(0, D,D,T,C1),
	dcb_add(C1,L,L,R,C2),
	dcb_add(C2,A,A,E,C3),
	dcb_add(C3,N,R,B,C4),
	dcb_add(C4,O,E,O,C5),
	dcb_add(C5,D,G,R,0),
	!,
	array_labeling([D,A,L,O,N,E,G,R,B,T]),
	fd_labeling(LC).




dcb_digit(D):- 
	D=[B3,B2,B1,_],
	B3 #==> #\ B2 #/\ #\ B1.




diff0([B3,B2,B1,B0]):-
	B3 #\/ B2 #\/ B1 #\/ B0.




all_dcb_digit_diff([]).

all_dcb_digit_diff([X|L]):-
	diff_of(L,X),
	all_dcb_digit_diff(L).




diff_of([],_).

diff_of([Y|L],X):-
	dcb_digit_diff(X,Y),
	diff_of(L,X).



dcb_digit_diff([X3,X2,X1,X0],[Y3,Y2,Y1,Y0]):-
	#\ ((X3 #<=> Y3) #/\ (X2 #<=> Y2) #/\ (X1 #<=> Y1) #/\ (X0 #<=> Y0)).




dcb_add(CI,[X3,X2,X1,X0],[Y3,Y2,Y1,Y0],[Z3,Z2,Z1,Z0],CO):-
	full_add(CI,X0,Y0,Z0,C1),
	full_add(C1,X1,Y1,I1,C2),
	full_add(C2,X2,Y2,I2,C3),
	full_add(C3,X3,Y3,I3,C4),
	I2 #\/ I1 #<=> I12,
	I3 #/\ I12 #<=> I123,
	C4 #\/ I123 #<=> Hex,
	half_add(I1,Hex,Z1,D2),
	full_add(D2,I2,Hex,Z2,D3),
	half_add(D3,I3,Z3,D4),
	C4 #\/ D4 #<=> CO.
	



full_add(CI,X,Y,Z,CO):-
	half_add(X,Y,Z1,C1),
	half_add(CI,Z1,Z,C2),
	C1 #\/ C2 #<=> CO.




half_add(X,Y,Z,CO):-
	X #/\ Y #<=> CO,
	X ## Y #<=> Z.




:- include(array).

% interface with for_each_... procedures

array_prog(_,_).




:- initialization(q).