1

我正在尝试制作一个程序,seat(Guests, Seating)如果可以将列表中的人重新排列到座位列表中,以便每个人都与两边的人兼容,那么我正在尝试制作一个程序。

我有每个人的事实:

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

ETC...

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

common(Person1, Person2, Topic)

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

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

4

1 回答 1

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).
于 2013-03-20T15:02:29.900 回答