2013-03-20 2 views
1

Я пытаюсь сделать программу, в которой находятся seat(Guests, Seating), если люди в списке. Гости могут быть перегруппированы в список «Гостиные», чтобы каждый из них был совместим с теми, которые с каждой стороны.Использование предиката Prolog select?

У меня есть факты для каждого человека:

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

и т.д ...

У меня также есть общий предикат, который является правилом, которое проверяет, если два человека имеют общую тему.

common(Person1, Person2, Topic) 

я должен использовать встроенный предикат выбора и мой пользователь, определенный общий предикат, но я не знаю, как.

Может ли кто-нибудь предоставить вам подходящее решение или объяснение?

ответ

4

Предполагая, что вы не должны иметь общие темы между первым и последним человеком из списка посиделки, вы можете:

  • Выберите один гость из гостей, это будет также получить список Seating без этого выбранный гость
  • Вызвать рекурсивную процедуру, которая принимает этого гостя, и выберет другого гостя (снова вернув списки оставшихся гостей) и проверьте совместимость. Если они совместимы, вызовите рекурсивно эту процедуру с новым гостем.
  • Основной случай этой процедуры - когда в списке гостей больше нет гостей.

Это будет выглядеть примерно так:

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

уточнить: таким образом, что это работает в том, что 'выбрать/3' будет выбрать элемент из списка (начиная с первого), и если это путь в дереве решений терпит неудачу, при обратном отслеживании 'select' выберет следующий элемент из списка, и поиск решения продолжится оттуда. – 2013-03-20 15:05:52

+0

@Boris, правильный !. 'select/3', как используется здесь (с первым и третьим аргументами, не являющимися статическими, и вторым аргументом, созданным экземпляром), возьмет один элемент из списка второго аргумента (объединив его по первому аргументу) и объединив третий аргумент с оставшимися элементы списка. При обратном отслеживании он будет тестироваться с любым другим элементом списка (второй аргумент 'select/3'). Конечно, вы также можете называть места со вторым списком, созданным для проверки, если список мест совместим с некоторыми списками гостей. – gusbro

+0

Спасибо, очень информативно! Отличная работа, понимайте это сейчас :) – Ciphor

Смежные вопросы