-- hoxide [2004-12-08 14:10:59]

1. Prolog简介

1.1. 我的练习

1.1.1. 八皇后问题

%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,[]).

下面两个都是回溯算法.

1.1.2. 农夫过河问题

有农妇, 狼 , 羊和白菜要过河, 只有一个渡船, 最多两样物品在船上...

有点丑陋~~~, 照书上的例子改的, 在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]).


1.1.3. 水壶问题

水壶问题, 有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]).