2017-10-21 1 views
2

まず最初に、私は完全にプロローグに新しく、Mが異なる場合、述語長(M、X、N) Nより大きいX.プロローグ内の述語は、MとNがX以上異なる場合に真です。

M(= dec.5)とN(= dec.2)がX(= dec.2)よりも異なる場合は真です。

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

私は私が(条件に、このような述語を構築することができる場合、私は疑問に思ってプロローグを再帰的に動作することを知っている:5と2が2以上である3の違いを持っ​​ているので、それが、この場合には真でありますたとえば<、>)をCなどの言語のように使用するか、プロローグでこれを行う別の方法があるかどうかを確認します。この簡単な質問を申し訳ありませんが、私はプロローグを開始しました。

+0

を 'dec.5'と' S(S(0)) 'もののすべては何ですか?あなたは[ask]を読むべきです。 – Enigmativity

答えて

3

より大きいまたは少ない条件用の述部を構成できます。

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

あなたは絶対差を検索する場合、あなたはこのような何かを行うことができます:

greater_than(s(_), 0). 
greater_than(s(X), s(Y)) :- 
    greater_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

ツールが多く役立っています。それはまさに私が探していたものでした。私はちょうど結合しなければならなかった。 – SEPS

+0

私はその長さ(0、0、0)を強制的にfalseにすることができるプロローグのコマンドを知っていますか?私の解決策がうまくいかなかったテストケースが1つ見つかったので、結果がfalseになるには(0、0、0)が必要です。 – SEPS

+0

@ SEPSあなたのルールと事実が 'length(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の述語が値を返さないことに注意してください - そう、彼らはtrueまたはfalseを返しません。彼らは成功するかしないかのどちらかです。通訳はあなたのプログラムが成功するかどうかを伝えるだけです。

+0

よろしいですか。しかしこれはちょうどXとNは等しくなければならず、Mは何でも構いませんが、XやNとすることはできません。 – SEPS

+0

@SEPS - これはMがNより大きい - または、あなたが "MはXよりもNと異なっています"と言っています。これは、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 
; ......... 
) 
関連する問題