-- hoxide [DateTime(2004-12-08T14:10:59Z)] TableOfContents
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]).