我有一个关于我的代码的小问题。(例如,它可以被解释为一个网格)
free(1,1).
free(1,3).
free(2,3).
free(2,1).
free(1,5).
free(5,6).
free(5,2).
free(5,4).
busy(5,1,white,pion).
busy(1,2,black,pion).
busy(1,4,black,pion).
busy(1,6,black,pion).
busy(5,3,white,pion).
busy(5,5,white,pion).
%all clauses for move/6
move(X,Y, X2,Y2,white,pion) :-
busy(X,Y,white,pion), free(X2,Y2), X2=X-1, Y2=Y-1.
move(X,Y, X2,Y2,white,pion) :-
busy(X,Y,white,pion), free(X2,Y2), X2=X-1, Y2=Y+1.
move(X,Y, X2,Y2,black,pion) :-
busy(X,Y,black,pion), free(X2,Y2), X2=X+1, Y2=Y-1.
move(X,Y, X2,Y2,black,pion) :-
busy(X,Y,black,pion), free(X2,Y2), X2=X+1, Y2=Y+1.
当我在SWI-Prol中执行这个语句时,它显示:false。
move(1,2,X,Y,black,pion).
在SWI-Prolog中,它显示:false.而它应该显示为true,并返回两个语句。
我不明白为什么它不工作,你能帮助我吗?
这只是因为你使用了 =
("确保左手边和右手边统一"),而不是。is/2
(在右手边评估算术表达式,并与左手边统一),甚至更好的是 #=
约束算术值相同,即使还不能解析所有变量),这里。
X2=X-1, Y2=Y-1.
这统一了 X2
与实际结构 -(X,1)
. 这将失败,因为 X2
将是一个值。
用。
:- use_module(library(clpfd)). % for #= predicate
move(X,Y, X2,Y2,white,pion) :-
busy(X,Y,white,pion), free(X2,Y2), X2 #= X-1, Y2 #= Y-1.
同时,将测试向前推进。
move(X,Y, X2,Y2,white,pion) :-
busy(X,Y,white,pion), X2 #= X-1, Y2 #= Y-1, free(X2,Y2).