如果列表中的人员可以重新排列到列表中,那么我正在尝试创建一个seat(Guests, Seating)
所持有的程序。这样每个人都可以兼容任何一方。
我为每个人都有事实:
topics(neil, [diving, football, computers, hockey]).
等...
我还有一个共同的谓词,它是一个测试两个人是否有共同主题的规则。
common(Person1, Person2, Topic)
我将不得不使用内置的select谓词和用户定义的公共谓词,但我不确定如何。
有人可以提供合适的解决方案或解释吗?
答案 0 :(得分:4)
假设您不必在座位列表的第一个和最后一个人之间有共同主题,您可以:
这看起来像是:
seats(Guests, [Person1|Seating]):-
select(Person1, Guests, NGuests),
seats1(Person1, NGuests, Seating).
seats1(_, [], []).
seats1(LPerson, Guests, [RPerson|Seating]):-
select(RPerson, Guests, NGuests),
common(LPerson, RPerson, _), % There is a common topic between them
seats1(RPerson, NGuests, Seating).