prolog学习_修道士野人问题

来源:互联网 发布:isp图像处理编程 编辑:程序博客网 时间:2024/05/01 10:46

只贴代码跟样例输出:

move(1,0).%表示船上有一位牧师,没有野人。 move(0,1). move(0,2). move(2,0). move(1,1). legal((X,Y,_)):- %X为左岸状态,Y为右岸状态。legal_temp(X), %分别判断两岸的状态是否合法。legal_temp(Y). legal_temp((X,Y)):- (X=:=0,Y>=0,!);(Y=:=0,X>=0,!);(X>=Y,X>=0,Y>=0). %牧师人数为0,野人的人数大于0/%野人人数为0,牧师的人数大于0/%牧师人数为0,野人的人数大于0,合法。update((X,Y,Q),Move,Statu):-(A,B)=X, (C,D)=Y,(E,F)=Move,                           if_then_else(                            Q=:=0,                           (C1 is C+E, D1 is D+F, A1 is A-E, B1 is B-F, Statu=((A1,B1),(C1,D1),1)),                             (C1 is C-E, D1 is D-F, A1 is A+E, B1 is B+F, Statu=((A1,B1),(C1,D1),0))                           ). valid(Statu,Statu1):- %两种状态互通且可走move(X,Y),update(Statu,(X,Y),Statu1),legal(Statu1). first_one(A,X):- append([A],_,X).         %A等于表X的第一个元素last_part(A,X):- first_one(B,X),append([B],A,X).   %得到A等于表X的除第一个元素的后部分表if_then_else(P,Q,R):- call(P),!,Q.      if_then_else(P,Q,R):- R.show(L):-if_then_else((length(L,X),X>0),(first_one(A,L),last_part(B,L),write('['),write(A),write(']'),nl,show(B)),fail).mcp(X,Y,L):- % L为储存的路由表。if_then_else(X=Y,  (write('================'),nl,show(L),nl)  , (valid(X,Z), not(member(Z,L)),mcp(Z,Y,[Z|L]))  ).

运行结果:

?- mcp(((0,0),(3,3),1),((3,3),(0,0),0),[((0,0),(3,3),1)]).================[(3,3), (0,0),0][(2,2), (1,1),1][(3,2), (0,1),0][(3,0), (0,3),1][(3,1), (0,2),0][(1,1), (2,2),1][(2,2), (1,1),0][(0,2), (3,1),1][(0,3), (3,0),0][(0,1), (3,2),1][(0,2), (3,1),0][(0,0), (3,3),1]================[(3,3), (0,0),0][(3,1), (0,2),1][(3,2), (0,1),0][(3,0), (0,3),1][(3,1), (0,2),0][(1,1), (2,2),1][(2,2), (1,1),0][(0,2), (3,1),1][(0,3), (3,0),0][(0,1), (3,2),1][(0,2), (3,1),0][(0,0), (3,3),1]================[(3,3), (0,0),0][(2,2), (1,1),1][(3,2), (0,1),0][(3,0), (0,3),1][(3,1), (0,2),0][(1,1), (2,2),1][(2,2), (1,1),0][(0,2), (3,1),1][(0,3), (3,0),0][(0,1), (3,2),1][(1,1), (2,2),0][(0,0), (3,3),1]================[(3,3), (0,0),0][(3,1), (0,2),1][(3,2), (0,1),0][(3,0), (0,3),1][(3,1), (0,2),0][(1,1), (2,2),1][(2,2), (1,1),0][(0,2), (3,1),1][(0,3), (3,0),0][(0,1), (3,2),1][(1,1), (2,2),0][(0,0), (3,3),1]
0 0