2017-10-26 18 views
1

、すなわち再帰で変数を割り当てる方法は?

inBox(a,b). 
inBox(b,c). 
inBox(c,d). 

INBOX(x、y)はmeansbox xはボックスyにある、あなたが他のボックス内のボックスの束を持っていると仮定する。今は、あるボックスが別のボックスの内部にあるかどうかを判断するメソッドを記述したいと思います。 insideBox(a、d)=真はaが内側のbで内側のcの内側にあるので真である。

insideBox(X, Y) :- inBox(X, Y), inBox(X, Z), insideBox(Z,Y). 

ロジックは、最初のボックスかどうかXのベースケースをチェックすることです。だから、自然に再帰的な問題と、それは「ワンボックスを上に移動」するために私の変数を初期化するために失敗した解決で私の試みであるように見えます現在ボックスY内にある場合は、inbox(X、Z)を呼び出してボックスXの値を取得し、再帰メソッドを呼び出します。私は、トレースを見て試してみましたが、何が起こっているのかの理由ではないことができます。

| ?- insideBox(a,d). 
    1 1 Call: insideBox(a,d) ? c 
    2 2 Call: inBox(a,d) ? c 
    2 2 Fail: inBox(a,d) ? c 
    1 1 Fail: insideBox(a,d) ? c 

私はZのような他のものは、変数Zを設定するための受信トレイ(X、_)で試してみたが、これは働いていませんどちらかと私はZがどのようにaの値で終わっているかの手がかりを持っていません。

?- insideBox(a,d). 

inBox(a,b). 
inBox(b,c). 
inBox(c,d). 

insideBox(X,Z) :- inBox(X,Z). 
insideBox(X,Z) :- inBox(X,Y), insideBox(Y,Z). 

ジャストサイドノート:あなたが使用条件に注意してください

答えて

2

はこれを試してみてください。変数を "代入"するのではなく、 "統一"します。また、あなたは "メソッド"を書いていない、あなたは "述語"を書いている。

+0

私は、用語を念頭に置くようにしています。私は、物理学も学ぶときには、適切な用語でかなりひどかったです。真を返す代わりに真を返すようにする方法もありますし、最終的には偽につながる解決策を探していますか? – Greg

+1

@Greg - 通常、プロローグは、より多くの解決策を見つけようとしない限り、一度しか成功しません。使用するシステムには設定が必要です。しかし、プロローグは何も返さない。それは成功するか失敗するかのいずれかです。 – Enigmativity

関連する問題