我有以下代码
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
为什么这样做?
为什么以这种方式重做模块计算?
答案 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失败)。 在第二种情况下以一种方式添加测试来解决此问题。