2013-10-27 33 views
0

我有如下因素代碼序言爲什麼我的功能結果始終爲true

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

manhatan2計算2點之間的曼哈坦距離給作爲一個2元素的列表[X,Y]

我不t理解爲什麼isInRange總是計算結果爲true

isInRange([0,0],[0,10],9)計算結果爲真 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從給定的列表

MODUL應該返回提取第X元素提取物| AB |

跟蹤isInRange([0,0],[0,10],100),當我whanted時。

當比較manhatan與範圍並且 開始重做模塊(0,10,_GXXX)時將_GXXX評估爲-10,因此追蹤isInRange([0,0],[0,10],9),因此Manhatan <範圍條件評估爲真,因此所有isInRange評估爲真

爲什麼這樣做?

爲什麼重做這種模塊計算?

回答

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。 您應該將第一個案例的測試更改爲A = < B. 或者,甚至更好的是使用內置的「abs」功能。

我假設在你之前的版本中,你沒有在第二種情況下進行測試。 在這種情況下,當第一種情況導致失敗時,Prolog將嘗試第二種情況(例如,因爲Range> Manhatan失敗)。 以一種方式在第二種情況下添加測試來解決此問題。

相關問題