2017-06-16 6 views
2

私は宿題に苦労しています。例えば、プロローグのエンティティ間の接続を見つける

のようなエンティティ間の接続を見つける必要性は、例えば、o1o3の間の関係を見つける。

rel(o1,p1,s2). 
rel(o2,p2,s4). 
rel(o3,p2,s1). 
rel(o7,p5,s5). 
rel(o9,p1,s4). 
rel(o2,p6,s7). 
rel(o3,p3,s2). 
rel(o6,p6,s3). 
rel(o5,p7,s2). 
rel(o4,p2,s1). 
rel(o3,p3,s1). 

ここで、pは関係である。私はこれまで何をやったか

は次のとおりです。

go(X,Y):-write(X),write(":1e: "),rel(X,Z,_),write(Z),write(":1r: "), 
     rel(Y,Z,_),write(Y),write(":1e: "),!. 

go(X,Y):-write(X),write(":2e: "),rel(X,Z,V),write(Z),write(":2r: "), 
     write(V),write(":2v: "),rel(Y,W,V),write(W),write(":2r: "), 
     write(Y),write(":2e: "),!. 

go(X,Y):-write(X),write(":3e: "),rel(X,Z,_),write(Z),write(":3r: "), 
     rel(W,Z,_),write(W),write(":3e: "),go(W,Y),!. 

go(X,Y):-write(X),write(":4e: "),rel(X,_,V),write(V),write(":4v: "), 
     rel(W,_,V),write(W),write(":4e: "),go(W,Y). 

をしかし、私はo1

go(o1, o3) 

プログラムo3との間の接続を見つけるしようとすると、最初の再帰的な反復で立ち往生。

+2

:。https://stackoverflow.com/questions/44557272/stop -pro-recursion-in-prologのための条件 – coder

答えて

3

私はあなたのコードを見ていませんでした。

私はこの問題を定義するために2つの公式を作成しました。まず、直接関係が存在するかどうかをチェックして、このファインダを終了できるようにします。

もう1つは、最初の引数とその他の点の関係を探しています。このプログラムは1つの弱点を持っています(しかし、あなたの例に影響を与えるかどうかは分かりません)。あなたがあなたの関係のサイクルを持っていた場合、あなたはすでにでてきたキャッシュポイントへのリストを使用するように持っているよりも、この質問が役立つかもしれ

relFinder(X1,X2) :- 
    (rel(X1,P,X2) ; rel(X2,P,X1)), 
    write(X1),write(" "), 
    write(P) ,write(" "), 
    write(X2). 

relFinder(X1,X2) :- 
(rel(X1,P,XT) ; rel(XT,P,X1)), 
    write(X1),write(" "), 
    write(P) ,write(" "), 
    relFinder(XT,X2). 
関連する問題