Запрос в прологе относительно факта и списка - PullRequest
0 голосов
/ 12 февраля 2011

Я новичок в Прологе и застрял в проблеме. У меня есть следующие факты:

_________________
likes(a,apple).
likes(a,banana).
likes(a,orange).
_________________

и мой запрос будет:

counts(a,Var).

, где Var = [apple,banana,orange]. Я не хочу таким образом, чтобы

Var=apple ;
Var=banana;
Var=orange;

Любые предложения или помощь будут оценены. Заранее спасибо.

Ответы [ 2 ]

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

Я бы прибегнул ко всемогущему findall/3, чтобы решить вашу проблему.

?- findall(Fruit, likes(a, Fruit), Fruits), length(Fruits, N).

Fruits = [apple,banana,orange]
N = 3

Таким образом, ваш counts(a, Var) - это просто вызов findall/3 (даже если он действительно собирает вместо подсчета):

counts(Person, Fruits) :- findall(Fruit, likes(Person, Fruit), Fruits).

И в результате вы получите следующее:

?- counts(a, Var).

Var = [apple,banana,orange]
0 голосов
/ 12 февраля 2011

Если я вас правильно понимаю, вы хотите посчитать количество сущностей, которым нравятся фрукты, представленные в виде списка.Итак, код будет примерно таким:

likes(a,apple).
likes(a,banana).
likes(a,orange).

counts(a, [_], 1).
counts(a, [H|T], Count) :- likes(a, H), counts(a, T, Count1), Count is 1 + Count1, !.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...