-- hoxide [2004-12-08 14:10:59]
Prolog简介
我的练习
八皇后问题
%8 quenece
q([], 9, B) :-
!,
write('the solution is:'),
write(B),
write('\n').
q(A, I, B) :-
select(L1, A, A1),
is(I1, I-1),
diagtest(B, I1, I, L1),
is(I2, I+1),
q(A1, I2, [L1|B]).
diagtest([],0,I,Li):-!.
diagtest([Lj|T], J, I, Li) :-
=\=(I+Li, J+Lj),
=\=(I-Li, J-Lj),
is(J1, J-1),
diagtest(T, J1, I, Li).
:-q([1,2,3,4,5,6,7,8],1,[]).下面两个都是回溯算法.
农夫过河问题
有农妇, 狼 , 羊和白菜要过河, 只有一个渡船, 最多两样物品在船上...
有点丑陋~~~, 照书上的例子改的, 在GNU-Prolog下通过测试.
% 农夫过河
problem(S,T):-
slove(S, T, [S], Solution, 0, Cost),
retract(cost(C)),
asserta(cost(Cost)),
write(Solution), write(Cost), write('\n'),
fail.
slove(X, T, CPP, [T|CPP], CCPP, CCPP+1):- rule(X, T), !.
slove(X, T, CPP, Solution, CCPP, Cost):-
rule(X, Z),
not(member(Z, CPP)),
cost(C),
<(CCPP+2, C),
is(CCPP1, CCPP+1),
slove(Z, T, [Z|CPP], Solution, CCPP1, Cost).
rule([A,B,C,D],[A1,B,C,D]):-p(A,A1), ok(A1,B,C,D).
rule([A,A,C,D],[A1,A1,C,D]):-p(A,A1),ok(A1,A1,C,D).
rule([A,B,A,D],[A1,B,A1,D]):-p(A,A1),ok(A1,B,A1,D).
rule([A,B,C,A],[A1,B,C,A1]):-p(A,A1),ok(A1,B,C,A1).
p(n, s).
p(s, n).
ok(A, B, A, D).
ok(A, A, C, A).
not(X) :- X, !, fail.
not(X).
go:-asserta(cost(20)), problem([n,n,n,n],[s,s,s,s]).
水壶问题
水壶问题, 有10L, 7L, 3L水壶, 有10L水在10L水壶中, 要用此三水壶量取5L水.
% 水壶问题
problem(S,T):-
slove(S, T, [S], Solution, 0, Cost),
retract(cost(C)),
asserta(cost(Cost)),
write(Solution), write(Cost), write('\n'),
fail.
slove(X, T, CPP, [T|CPP], CCPP, CCPP+1):- rule(X, T), !.
slove(X, T, CPP, Solution, CCPP, Cost):-
rule(X, Z),
not(member(Z, CPP)),
cost(C),
<(CCPP + 2, C),
is(CCPP1, CCPP+1),
slove(Z, T, [Z|CPP], Solution, CCPP1, Cost).
rule([X, Y, 3], [0,7,3]):- =\=(X, 0).
rule([X, 7, Z], [0,7,3]):- =\=(X, 0).
rule([X, Y, Z], [X1,0,Z]):-
=\=(Y, 0), =\=(Z,0),
is(X1, 10-Z).
rule([X, Y, Z], [X,0,Z1]):-
=\=(Y, 0), =\=(Z,3),
is(Z1,10-X), Z1<3.
rule([X, Y, Z], [X1,Y, 0]):-
=\=(Z, 0), =\=(Y,0),
is(X1,10-Y).
rule([X, Y, Z], [X, Y1, 0]):-
=\=(Z,0), =\=(Y,7),
is(Y1, 10-X), Y1<7.
rule([X, Y, Z],[X1, 7, Z]):-
=\=(X, 0), =\=(Y, 7),
is(W, X+Y), is(X1, W-7).
rule([X, Y, Z], [X1, Y, 3]):-
=\=(X, 0), =\=(Z, 3),
is(W, X+Z), is(X1, W-3).
rule([X, Y, Z], [X, Y1, 3]):-
=\=(Y, 0), =\=(Z, 3),
is(W,Z+Y), is(Y1, W -3).
rule([X, Y, Z], [X, 7, Z1]):-
=\=(Z, 0), =\=(Y, 7),
is(W, Z+Y), is(Z1, W-7).
not(X) :- X, !, fail.
not(X).
go:- asserta(cost(20)), problem([10,0,0],[X, 5, Z]).