没有预期的建设成果

问题描述 投票:0回答:1

我有一个关于我的代码的小问题。(例如,它可以被解释为一个网格)

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,并返回两个语句。

  • X2 =2 , Y2=1
  • X2=2,Y2=3

我不明白为什么它不工作,你能帮助我吗?

prolog
1个回答
1
投票

这只是因为你使用了 = ("确保左手边和右手边统一"),而不是。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).
© www.soinside.com 2019 - 2024. All rights reserved.