2016-11-08 6 views
0

私は最初のプロローグのhello worldプログラムを書いたばかりです。Prolog - 事実から得られるすべての値

私は私が参照してくださいしようとしていますこのチュートリアルを見た:

enter image description here

目的:

を私はノードy、ノードXからのパスをチェックしようとしています。私は再帰を使用したいが、基本ケースをどのように与えるかはわからない。 Link(X ,?)の可能性をどのように実行するか。私は(D、B)のパスがあるかどうかを確認しようとしています

:上の画像のように、grand_parent機能はA.

例のすべての可能な出力を与える変数が渡されますそれは、次の反復処理したい:ここ

link(b,d) 

link(b,p) -> link(p,d) is false 

link(b,c) -> link(c,d) is true so return yes. 

を私のコードです:

link(a, b). 
link(b, p). 
link(b, c). 
link(c, d). 
link(d, q). 
link(d, r). 

link(X,Y) :- 
    for all A links from X: 
    link(A,Y). 

check_for_node(X,Y) :- 
    node(X), 
    node(Y). 

check_reverse_path(X,Y) :- 
    link(Y,X). 

path(X,Y) :- 
    check_for_node(X,Y), 
    link(X,Y). 

path(X,Y) :- 
    check_for_node(X,Y), 
    check_reverse_path(X,Y). 

答えて

1

は今、あなたはlink sおよびpathのための異なる述語を持っていることを、我々は次の操作を実行できます。

path(X,Y) :- 
    link(X,Y). 

path(X,Y) :- 
    link(X,A), 
    A != Y, ; to avoid repeating what was caught by above, tho probably not necessary 
    path(A,Y). 
+0

それを見つけた私は私の質問を編集しました。 – technazi

+0

これはうまくいきません。スタックのオーバーフローを示します。 – technazi

0

私はhere

node(a). 
node(b). 
node(c). 
node(d). 
node(p). 
node(q). 
node(r). 

link(a, b). 
link(b, p). 
link(b, c). 
link(c, d). 
link(d, q). 
link(d, r). 

check_for_node(A,B) :- 
    node(A), 
    node(B). 

connected(A,B) :- link(A,B);link(B,A). 

travel(A,B,P,[B|P]) :- 
    connected(A,B). 

travel(A,B,Visited,Path) :- 
    connected(A,C),   
    C \== B, 
    \+member(C,Visited), 
    travel(C,B,[C|Visited],Path). 

path(A,B,Path) :- 
    check_for_node(A,B), 
    travel(A,B,[A],Q), 
    reverse(Q,Path). 
関連する問題