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
- prolog学习_修道士野人问题
- 修道士与野人问题
- 修道士和野人问题
- 请教“修道士与野人问题”
- 野人与修道士问题的Ruby实现
- C++习题:野人与修道士过河问题
- 2.修道士和野人问题
- 修道士和野人
- 修道士和野人过河问题 A*算法 人工智能
- prolog学习_八皇后问题
- 修道士与野人问题——C++源代码,伪代码,详细分析
- 修道士过河问题
- 修道士过河问题
- 传教士野人过河问题
- 野人传教士问题
- 野人过河问题
- 传教士 野人 过河问题
- 野人过河问题
- 网络编程(30)—— IP地址分类和子网掩码的作用
- JAVA中==和equals的区别
- 笑死了,打错一个字,竟然...
- 输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来. 提示:帧头和帧尾分别是head和tail 字符串”asdheadhauboisoktail”中headhaubo
- 内存映射+矩阵
- prolog学习_修道士野人问题
- sed的详细用法demo
- 2016年11月
- 利用命令来打开所有程序,这个装逼给满分!
- javaweb项目在linux系统中测试时的乱码问题解决
- View的事件分发机制
- Atitit 图像处理 灰度图片 灰度化的原理与实现
- Atitit Gaussian Blur 高斯模糊 的原理and实现and 用途
- 小波的秘密3_连续、离散小波变换定义