В Прологе, как я могу проверить N элементов в списке A в списке B? - PullRequest
0 голосов
/ 27 февраля 2011

У меня есть эти два списка =

fruits([banana, apple, mangoes, pears]).
foodILike([hamburgers, banana, shakes, fries]).

Я хочу написать предикат пролога, который вернет истину, как только он увидит 1 элемент в списке foodsILike в списке фруктов.Как я могу сделать это?

Ответы [ 2 ]

3 голосов
/ 27 февраля 2011

Во-первых, для простого ответа:

fruitsILike(F) :-
  fruits(Fs)
  member(F, Fs),
  foodILike(Ls),
  member(F, Ls).

Вы можете избежать проверки членства, свернув списки фруктов и продуктов:

fruit(banana).
fruit(apple).
...
foodILike(hamburger).
foodILike(banana).
...
fruitsILike(F) :-
  fruit(F),
  foodILike(F).

Тем не менее, вы, кажется, пытаетесь решить проблемы в Прологе, используя императивные идиомы, и это не сработает. Во-первых, предикаты ничего не возвращают. При вызове предиката Prolog объединяет его аргументы с допустимыми значениями в соответствии с фактами и правилами в программе. Следовательно, «возвращаемое значение» - это присвоение несвязанным переменным. Во-вторых, Пролог не делает что-то «так скоро». Он перебирает все возможные решения. Вы получаете первое решение, затем второе решение и т. Д.

1 голос
/ 27 февраля 2011

member может 1) индивидуально сгенерировать всех членов данного списка и / или 2) дать ответ «да / нет» относительно того, находится ли конкретный элемент в конкретном списке.Я полагаю, что вы хотите использовать первую форму на fruits для генерации каждого из элементов fruit, а вторую форму на foodILike, чтобы увидеть, присутствует ли какой-либо из них.

...