【发布时间】:2015-08-24 17:36:26
【问题描述】:
我需要使用 Prolog 解决 Ship Puzzle 问题。 以下是事实。
有 5 艘船。
- 希腊船六点出发,载着咖啡。
- 中间的船有一个黑色的烟囱。
- 英国船九点出发。
- 蓝色烟囱的法国船位于运送咖啡的船的左侧。
- 载可可的船的右侧是一艘前往马赛的船。
- 巴西船正驶向马尼拉。
- 载米的船旁边是一艘带绿色烟囱的船。
- 去热那亚的船五点出发。
- 西班牙船七点出发,在前往马赛的船的右侧。
- 带红色烟囱的船驶往汉堡。
- 七点出发的船旁边是一艘带白色烟囱的船。
- 边境的船载着玉米。
- 黑色烟囱的船八点出发。
- 运送玉米的船锚定在运送大米的船旁边。
- 去汉堡的船六点出发。
哪艘船开往塞得港?哪艘船运茶?
我在互联网上搜索答案,但找不到任何答案。所以我参考了“斑马拼图”,因此我为这个问题安排了代码。所以这是我的 Prolog 代码的问题。
exists(A,(A,_,_,_,_)).
exists(A,(_,A,_,_,_)).
exists(A,(_,_,A,_,_)).
exists(A,(_,_,_,A,_)).
exists(A,(_,_,_,_,A)).
rightOf(A,B,(B,A,_,_,_)).
rightOf(A,B,(_,B,A,_,_)).
rightOf(A,B,(_,_,B,A,_)).
rightOf(A,B,(_,_,_,B,A)).
middleShip(A,(_,_,A,_,_)).
lastShip(A,(_,_,_,_,A)).
nextTo(A,B,(B,A,_,_,_)).
nextTo(A,B,(_,B,A,_,_)).
nextTo(A,B,(_,_,B,A,_)).
nextTo(A,B,(_,_,_,B,A)).
nextTo(A,B,(A,B,_,_,_)).
nextTo(A,B,(_,A,B,_,_)).
nextTo(A,B,(_,_,A,B,_)).
nextTo(A,B,(_,_,_,A,B)).
solution(PortSaidShip, TeaCarrier) :-
Shipes = (ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_),ship(_,_,_,_,_)),
exists(ship('Greek',6,'Coffee',_,_),Shipes),
middleShip(ship(_,_,_,_,'Black',_),Shipes),
exists(ship('English',9,_,_,_),Shipes),
rightOf(ship(_,_,'Coffee',_,_),ship('French',_,_,'Blue',_),Shipes),
rightOf(ship(_,_,_,_,'Marseille'),ship(_,_,'Cocoa',_,_),Shipes),
exists(ship('Brazilian',_,_,_,'Manila'),Shipes),
nextTo(ship(_,_,_,'Green',_),ship(_,_,'Rice',_,_),Shipes),
exists(ship(_,5,_,_,'Genoa'),Shipes),
rightOf(ship('Spanish',7,_,_,_),ship(_,_,_,_,'Marseille'),Shipes),
exists(ship(_,_,_,'Red','Hamburg'),Shipes),
nextTo(ship(_,_,_,'White',_),ship(_,7,_,_,_),Shipes),
lastShip(ship(_,_,'Corn',_,_),Shipes),
exists(ship(_,8,_,'Black',_),Shipes),
nextTo(ship(_,_,'Corn',_,_),ship(_,_,'Rice',_,_),Shipes),
exists(ship(_,6,_,_,'Hamburg'),Shipes),
exists(ship(PortSaidShip,_,_,_,'Port Said'),Shipes),
exists(ship(TeaCarrier,_,'Tea',_,_),Shipes).
但是当我运行程序时它会说'false'。
那么我该如何解决这个问题呢?
谢谢
【问题讨论】:
-
您正在执行的返回 'false' 的 exact 查询是什么?
-
尝试分析解决方案的子目标。如果您有规则
solution :- A, B, C, D, E.,它可能会失败,因为A失败,或B失败,或...,或E失败。尝试检查各个目标以及它们给您带来的结果。 -
@MartynA:由于使用所有其他定义的唯一谓词的最一般查询已经失败,因此只能是那个查询。
-
@false:我们可能有不同的目的。您假设 OP 试图执行什么查询?
-
solution(PortSaidShip, TeaCarrier)这是最通用的一个。也就是说,任何更具体的方法也会失败。
标签: prolog zebra-puzzle