1

私はseat(Guests, Seating)、リストのゲストがリストの座席に再配置され、それぞれがどちらの側の人々とも互換性があるかどうかを保持するプログラムを作成しようとしています。

私は一人一人の事実を持っています:

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

等...

また、2人が共通のトピックを持っているかどうかをテストするルールである、共通の述語もあります。

common(Person1, Person2, Topic)

組み込みのselect述語とユーザー定義の共通述語を使用する必要がありますが、その方法がわかりません。

誰かが適切な解決策や説明を提供できますか?

4

1 に答える 1

4

座席リストの最初の人と最後の人の間で共通のトピックを持っている必要がないと仮定すると、次のことができます。

  • ゲストからゲストを1人選択します。これにより、選択したゲストがいない座席リストも取得されます
  • そのゲストを取得して別のゲストを選択する再帰プロシージャを呼び出し(ここでも残りのゲストのリストを返します)、互換性をテストします。それらに互換性がある場合は、新しいゲストを使用してその手順を再帰的に呼び出します。
  • この手順の基本的なケースは、ゲストリストにゲストがいない場合です。

これは次のようになります。

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 に答える