私はPrologスクリプトに一連の可能性を持っており、リストのすべてのペアに適用される特定の述語が真と評価する最大のセットを見つけたいと考えています。PrologはList内のすべてのペアを述語化しますか?
簡略化した例は人の集合であり、すべてが相互の友人である最大のグループを探したいとします。だから、与えられた:
% Four-way friend CIRCLE
link(tom, bill).
link(bill, dick).
link(dick, joe).
link(joe, tom).
% Four-way friend WEB
link(jill, sally).
link(sally, beth).
link(beth, sue).
link(sue, jill).
link(jill, beth).
link(sally, sue).
% For this example, all friendships are mutual
friend(P1, P2) :- link(P1, P2); link(P2, P1).
可能な一致は、(明確にするため、アルファベット順に各ペアを提示)する必要があります。
% the two-person parts of both sets :
[bill, tom], [bill, dick], [dick, joe], [joe, tom],
[jill, sally], [beth, sally], [beth, sue], [jill, sue],
[beth, jill], [sally, sue]
% any three of the web :
[beth, jill, sally], [beth, sally, sue], [beth, jill, sue]
% and the four-person web :
[beth, jill, sally, sue]
私はすべての二人はと一致見つけることができます:
% Mutual friends?
friendCircle([Person1, Person2]) :-
friend(Person1, Person2),
% Only keep the alphabetical-order set:
sort([Person1, Person2], [Person1, Person2]).
しかし、私は大きなセットを見つけようとしているのにうんざりする。
friendCircle([Person1|Tail]) :-
friendWithList(Person1, Tail),
Tail = [Person2|Tail2],
% Only keep if in alphabetical order:
sort([Person1, Person2], [Person1, Person2]),
friendWithList(Person2, Tail2).
% Check all members of the list for mutual friendship with Person:
friendWithList(Person, [Head|Tail]) :-
friend(Person, Head), % Check first person in list
friendWithList(Person, Tail). % Check rest of list
しかし、私がそれを実行すると、2人の人物のリストを列挙した後、Prologがハングアップし、最終的にスタック領域がなくなります。私は間違って何をしていますか?
私は何をしようとしていることは五友人Web用友の状態のためにこれらの対の各々をチェックすることになるウェブを、歩くされています。私は私の2つのfriendsWithList/2
通話考えたものである
(1,2) (1,3), (1,4), (1,5) % Compare element 1 with the rest of the list
(2,3), (2,4), (2,5) % Remove element 1 and repeat
(3,4), (3,5)
(4,5)
friendCircle/1
ルールでしていました。
注 'ソート([PERSON1、PERSON2]、[PERSON1、PERSON2])は'' Person1 @ =
@larsman:それは本当に複雑な方法です。しかし、あなたが言っていることは明らかではありません。 '? - Person1 = john、sort([Person1、Person2]、[Person1、Person2])。' ' ' Person2 = john.'を与える。 – false