使用Prolog选择谓词?

时间:2013-03-20 14:30:53

标签: select recursion prolog logic predicate

如果列表中的人员可以重新排列到列表中,那么我正在尝试创建一个seat(Guests, Seating)所持有的程序。这样每个人都可以兼容任何一方。

我为每个人都有事实:

topics(neil, [diving, football, computers, hockey]).

等...

我还有一个共同的谓词,它是一个测试两个人是否有共同主题的规则。

common(Person1, Person2, Topic)

我将不得不使用内置的select谓词和用户定义的公共谓词,但我不确定如何。

有人可以提供合适的解决方案或解释吗?

1 个答案:

答案 0 :(得分:4)

假设您不必在座位列表的第一个和最后一个人之间有共同主题,您可以:

  • 从来宾中选择一位客人,这也将获得没有该选定客人的座位列表
  • 调用一个递归过程,该过程接受该guest虚拟机并选择另一个guest虚拟机(再次返回剩余guest虚拟机列表),并测试兼容性。如果它们是兼容的,则以新访客的方式递归该调用。
  • 此过程的基本情况是来宾列表中没有其他访客。

这看起来像是:

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).