Prolog为什么我的函数总是评估为true

时间:2013-10-27 08:42:43

标签: prolog

我有以下代码

isInRange(Point1,Point2,Range):-
manhatan2(Point1,Point2,Manhatan),
Range>Manhatan.

manhatan2计算2点之间的曼哈顿距离作为2元素列表[X,Y]

我不明白为什么isInRange总是评估为真

isInRange([0,0],[0,10],9)的计算结果为true isInRange([0,0],[0,10],100)也计算为真

我很确定我做了manhatan功能。用很多值测试了它

任何人都可以帮我理解我的代码有什么问题吗?

%编辑从这里开始

所以我追踪该死的东西,这里有更多我使用的代码

modul(A,B,R):-A<B,R is B-A.
modul(A,B,R):-A>B,R is A-B.

extractFromList([H|_],X,R):- X is 0,R is H.
extractFromList([_|T],X,R):- X1 is X-1,extractFromList(T,X1,R).

manhatan(X1,Y1,X2,Y2,R):- modul(X1,X2,R1),modul(Y1,Y2,R2),R is R1+R2.

manhatan2(P1,P2,R):-
extractFromList(P1,0,X1),
extractFromList(P1,1,Y1),
extractFromList(P2,0,X2),
extractFromList(P2,1,Y2),
manhatan(X1,Y1,X2,Y2,R).

fromFromList的提取从特定列表中提取第X个元素

modul应该返回| A-B |

追踪isInRange([0,0],[0,10],100),因为我感动了。

跟踪isInRange([0,0],[0,10],9)在比较manhatan和范围时停止运行 开始重做modul(0,10,_GXXX),评估_GXXX为-10,因此Manhatan&lt;范围条件评估为true,因此所有isInRange评估为true

为什么这样做?

为什么以这种方式重做模块计算?

1 个答案:

答案 0 :(得分:0)

答案简短: 以下代码可以满足您的需求:

manhattan(L1,L2,Result) :- manhattan(L1,L2,0,Result).

manhattan([],[],Res,Res).
manhattan([H1|T1],[H2|T2],Acc,Res) :-
    AccNew is Acc + abs(H1-H2),
    manhattan(T1,T2,AccNew,Res).

isInRange(P1, P2, Range) :-
    manhattan(P1, P2, Distance),
    Range > Distance.

更长的回答: 我尝试了你的代码,它的行为并不像你描述的那样。 对我来说,isInRange总是失败,因为如果A == B,'modul'会失败。 您应该将第一个案例的测试更改为A =&lt; B. 或者,更好的是,使用内置的'abs'功能。

我认为在您之前的版本中,您没有在第二种情况下进行测试。 在那种情况下,Prolog将在第一种情况导致失败时尝试第二种情况(例如因为Range&gt; Manhatan失败)。 在第二种情况下以一种方式添加测试来解决此问题。