2017-10-21 77 views
2

首先我完全新的PROLOG和我試圖寫的謂詞長度(M,X,N),這是真實的,如果M不同於ñ比X.謂詞在序言其爲真,如果M和N相差超過X

更我寫了下面測試用例如果M(= Dec.5號)和N(= Dec.2號)不同比X(= Dec.2號)更是如此。正是在這種情況下,正確的,因爲5和2的3差別是超過2:

?- length(s(s(s(s(s(0))))), s(s(0)), s(s(0))). 
    true . 

我知道序言工作遞歸所以我想知道如果我可以構造具有條件這樣的謂詞(用於例如<,>)就像C語言一樣,或者如果在序言中有另一種方法可以做到這一點。對不起,這個簡單的問題,但我剛開始prolog。

+0

什麼是所有的'dec.5'和單曲的(S(0))'的東西?你應該閱讀[問]。 – Enigmativity

回答

3

您可以構建謂詞更大或更小。例如:

greater_than(s(_), 0). 
greater_than(s(X), s(Y)) :- 
    greater_than(X, Y). 

而且類似:

less_than(0, s(_)). 
less_than(s(X), s(Y)) :- 
    less_than(X, Y). 

如果你想找到的絕對差異,你可以做這樣的事情:

abs_diff(0, 0, 0). 
abs_diff(s(X), 0, s(X)). 
abs_diff(0, s(X), s(X)). 
abs_diff(s(X), s(Y), D) :- 
    abs_diff(X, Y, D). 

這些概念應該幫助踢啓動一些如何解決其餘問題的想法。

+0

THX你的工具幫了很大忙。那正是我所期待的。我只需要結合。 – SEPS

+0

你知道prolog中的一個命令,我可以強制該長度(0,0,0)導致錯誤。我需要(0,0,0)導致錯誤,因爲我發現一個測試用例在我的解決方案不起作用。 – SEPS

+0

@SEPS你只需要確保你的規則和事實不允許'長度(0,0,0)'成功。如果查詢不成功,則失敗。 – lurker

0

試試這個:

?- length(s(s(s(s(s(0))))), s(s(0)), s(s(0))). 

length(s(_),0,0). 
length(s(M),s(X),s(N)) :- length(M,X,N). 

千萬記住的Prolog的謂詞不返回值的 - 所以他們不返回truefalse。他們要麼成功,要麼沒有。解釋者只是告訴你,如果你的程序成功與否。

+0

好的。但是,這只是說,X和N必須是平等的,M可以是任何東西,但它不能是X或N.這有什麼好做M和N – SEPS

+0

@SEPS之間的區別 - 不,這表示,m必須是大於N - 或者如你所說「M與N大於X不同」。這是行不通的,M等於或小於N. – Enigmativity

3

這個答案跟在@ lurker的正確答案,並通過利用 first argument clause indexing提高了輔助謂詞abs_diff/3的確定性。

介紹x_y_dist/3

x_y_dist(0, Y, Y). 
x_y_dist(s(X), Y, Z) :- 
    y_sx_dist(Y, X, Z). 

y_sx_dist(0, X, s(X)). 
y_sx_dist(s(Y), X, Z) :- 
    x_y_dist(X, Y, Z). 

樣品查詢:

?- x_y_dist(X, Y, s(s(0))).        % |X-Y| = 2 
( X =   0  , Y =   s(s(0))   % |0-2| = 2 
; X =  s(s(0)) , Y =    0    % |2-0| = 2 
; X =   s(0) , Y =  s(s(s(0)))   % |1-3| = 2 
; X =  s(s(s(0))) , Y =   s(0)    % |3-1| = 2 
; X =  s(s(0)) , Y =  s(s(s(s(0))))   % |2-4| = 2 
; X = s(s(s(s(0)))) , Y =   s(s(0))   % |4-2| = 2 
; X =  s(s(s(0))) , Y = s(s(s(s(s(0)))))   % |3-5| = 2 
; X = s(s(s(s(s(0))))), Y =  s(s(s(0)))   % |5-3| = 2 
; X = s(s(s(s(0)))) , Y = s(s(s(s(s(s(0))))))  % |4-6| = 2 
; ......... 
)