/************************************************************************/ /* AI homework 4 */ /* Author J. T. Jou */ /************************************************************************/ /* 1. This program was tested under SICStus Prolog */ /* 2. Please type start(X) to run */ /* 3. Type your input ending with a dot ('.'). */ /************************************************************************/ :-dynamic query/3. start(X):-retractall(query(_,_,_)),!,mm(X). mm(X):-guess(X),verify(X). guess(X):-X=[X1,X2,X3,X4], Y=[1,2,3,4,5,6,7,8,9,0], select(X,Y). select([X|Xs],Ys):-delete(X,Ys,Zs), select(Xs,Zs). select([],_). delete(X,[X|Ys],Ys). delete(X,[Y|Ys],[Y|Zs]):-delete(X,Ys,Zs). verify(X):-not(inconsistent(X)),ask(X). inconsistent(Y):-query(X,B,C), bulls(X,Y,B1), bulls_cows(X,Y,BC), C1 is BC-B1, (B\==B1;C\==C1). bulls([],[],0). bulls([X|Xs],[X|Ys],N1):-!,bulls(Xs,Ys,N),N1 is N+1. bulls([_|Xs],[_|Ys],N):-bulls(Xs,Ys,N). bulls_cows([],_,0). bulls_cows([A|X],Y,N1):-member(A,Y),!,bulls_cows(X,Y,N),N1 is N+1. bulls_cows([_|X],Y,N):-bulls_cows(X,Y,N). ask(X):-write('How many bulls in '),write(X),write('? '),read(B),nl, write('How many cows in '),write(X),write('? '),read(C),nl, integer(B),integer(C),BC is B+C,BC=<4,assert(query(X,B,C)),!, B=4. not(X):-X,!,fail. not(_). member(X,[X|_]):-!. member(X,[_|Xs]):-member(X,Xs). query(_,_,_):-fail.