2017-12-05 42 views
2

私はPrologに新しいです。私は、ある人物が他の人の友人か友人かどうかを調べるための質問を書こうとしています。Prolog、友達の友達

私はこのようないくつかの事実を持っている:私はこのような何かをした

visible(joe, ann). 
true 

friends(joe, [john, ann, pete, ellen, 
      maria, jose, bruno, ali, jing, yang]). 
friends(john, [rick]). 
friends(ellen, [mia, xing, jun, maria]). 
friends(maria, [pete, ellen, zhang, jose, serena]). 
friends(serena, [ali, rick, zhang, mia]). 
friends(jose, [maria, jose, bruno, ali, jing]). 

私の目標は、このようなクエリ書くことです

visible(X,Y) :- friends(X,[Y|T]); member(Y,T). 
visible(X,Y) :- visible(X,Z), visible(Z,Y). 

member(X,[X|T]). 
member(X,[H|T]) :- member(X,T). 

をしかし、それは無限ループになります。私はベースケースを書く方法を知らない。

この関係はループを持つグラフです。友人の友人を再帰的に見つけ出すにはどうしようもありませんか?

+0

'友人(X、Y):あなたも、このプロパティをしたい場合は、

visible(X,Y):- friends(Y,XS), member(X,XS). 

クエリを追加する必要があります[この定義](https://stackoverflow.com/q/26946133/772868)を使用して、可視(X、Y): - 閉包(friend、X、Y) – false

+0

エラー:未定義プロシージャ:閉包/ 3、例外:(9)閉鎖(friend、a、b)このエラーが発生しましたか?私が可視(a、b)を照会するとき。 –

+0

上記のリンクで 'closure/3'の定義を使う必要があります! – false

答えて

1
visible(X,Y):- friends(X,YS), member(Y,YS). 
visible(X,Y):- friends(X,XF), friends(Y,YF), member(Z,XF), member(Z,YF). 

最初の行をチェックし、二人は直接の友人(YXの友人のリストに含まれている)している場合。 2番目の行は、2つのpeolpeが友人の友人かどうかをチェックします(ZXYの両方の友人のリストにあります)。また、共通の友人であることを知りたい場合は、write(Z)を追加できます。この場合、例えば、joejohnの友人ですが、逆の意見はありません。友人(X、イース)、メンバー(Y、イース).`や ` - :

?-visible(john,serena). 
true. 

?-visible(joe,john). 
true. 

?-visible(john,joe). 
true. (only if you add the third line of code). 
+0

質問をして真の結果を得ようとすると、 '。'を入力する必要があります。 'true'の後にコマンドを終了します。これはどうやって起こるか知っていますか? –

+0

@Shiloh_Cどういう意味ですか?どのようなプロローグを使用していますか? – damianodamiano