Hei*_*idi 3 logic prolog logic-programming zebra-puzzle
这是我目前的代码,我正在努力解决斑马拼图.
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)).
middleHouse(A,(_,_,A,_,_)).
firstHouse(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)).
:- Houses = (house(N1,P1,S1,D1,C1),house(N2,P2,S2,D2,C2),house(N3,P3,S3,D3,C3),house(N4,P4,S4,D4,C4),house(N5,P5,S5,D5,C5)),
exists(house(english,_,_,_,red),Houses),
exists(house(spainish,dog,_,_,_),Houses),
exists(house(_,_,_,coffee,green),Houses),
exists(house(ukrainian,_,_,tea,_),Houses),
rightOf(house(_,_,_,_,green),house(_,_,_,_,ivory),Houses),
exists(house(_,dog,oldgold,_,_),Houses),
exists(house(_,_,kools,_,yellow),Houses),
middleHouse(house(_,_,_,milk,_),Houses),
firstHouse(house(norwegian,_,_,_,_),Houses),
nextTo(house(_,_,chesterfields,_,_),house(_,fox,_,_,_),Houses),
nextTo(house(_,_,kools,_,_),house(_,horse,_,_,_),Houses),
exists(house(_,_,luckystike,orangejuice,_),Houses),
exists(house(japanise,_,parliments,_,_),Houses),
nextTo(house(norwegian,_,_,_,_),house(_,_,_,_,blue),Houses),
exists(house(WaterDrinker,_,_,water,_),Houses),
exists(house(ZebraOwner,zebra,_,_,_),Houses).
Run Code Online (Sandbox Code Playgroud)
我输入了它并将其保存为zebra.pl,我打开它并将[zebra]输入SWI-prolog,它返回一个关于单例使用N1,P1,C1等的警告消息并返回true,然后我要求它使用print(WaterDrinker)打印饮水器并返回_G317并且为true,
为什么它这样做并且没有返回可能是挪威语的答案,如果我要求它返回任何变量如C3或ZebraOwner它也会这样做
主要问题是你无法:- Houses = ...
在程序中间编写目标.相反,你应该写类似的东西
solution(WaterDrinker, ZebraOwner) :-
Houses = ...
Run Code Online (Sandbox Code Playgroud)
然后在程序加载后输入
solution(W, Z).
Run Code Online (Sandbox Code Playgroud)
在-?
提示计算解决方案.
您也没有指定所有值都应该是不同的.如果这样做,您将再次使用变量,警告将消失.
如果你真的只需要一个变量,你可以在它前面添加一个下划线来使警告消失.或者你可以使用下划线,就像你已经多次使用过.
归档时间: |
|
查看次数: |
3306 次 |
最近记录: |