2016-05-02 6 views
0

私はPrologには比較的新しいので、私に同行してください。 same(P1, P2, H)は本当だろうリストを比較する述語を作る?

hobbies(mark, [running, video_games, soccer]) 
hobbies(jasmine, [writing, swimming, music]) 
hobbies(john, [rugby, rowing, pets, politics]) 
hobbies(lisa, [gymnastics, dancing, television]) 

私は今何をしたいか、述語を定義している(のはsameそれを呼びましょう):私は、それぞれ1人が含まれており、どのような彼らの趣味は(リストに)していることは事実を持っていると言いますP1P2に趣味がある場合はHが共通です。私はメンバー述語を使用する必要があることを知っていますが、これまで単純なケースでそれを使用する方法を学んだだけです。

same(P1, P2, H) :- member(H, P1), member(H, P2) 

もちろん、私はそれができないことを知っています。それらの事実の中でリストにアクセスするにはどうすればいいですか?

+1

'メンバー(H、P1)は '意味がありません。ある人物について、「P1」と言うと、趣味のリストはどのような関係で定義されていますか?そして、あなたはそれらを変数、例えば 'HobbyList1'にどのように入れますか?そうすれば 'メンバー(H、HobbyList1)'と言うことができます。 – lurker

答えて

1

member述語を使用するには、リストが必要です。だから、P1P2の趣味のリストを取得する必要があります。どうやってするの? 'H'が趣味で、 `P1`が人であるため hobbies事実

hobbies(mark, [running, video_games, soccer]). 
hobbies(jasmine, [writing, swimming, music]). 
hobbies(john, [rugby, rowing, pets, politics]). 
hobbies(lisa, [gymnastics, dancing, television, video_games]). 

same(P1, P2, H) :- 
    % Hobbies1 is a list of hobbies of P1 
    hobbies(P1, Hobbies1), 
    member(H, Hobbies1), 
    % Hobbies2 is a list of hobbies of P2 
    hobbies(P2, Hobbies2), 
    member(H, Hobbies2), 
    % P1 and P2 are not the same. Also eliminates symmetrical redundancy 
    P1 @< P2. 

クエリ

?- same(P1, P2, H). 
P1 = mark, 
P2 = lisa, 
H = video_games ; 
false. 
を使用すると、
+0

そして、 'not @(P1 = P2)'の代わりに '@ @P2'を使うと、対称的な冗長性をなくすことができます。 – lurker

+0

難しいですが、私は理解していると思います!ありがとう:) – Navy670

+0

はい@lurker。それは良いアドバイスです。私は答えを変えた – malbarbo

関連する問題