Как вернуть уникальные результаты из базы знаний в Прологе? - PullRequest
0 голосов
/ 29 февраля 2012

Здесь начинающий пролог.

Допустим, у меня есть база знаний по прологу, в которой содержится еда и ее цена, например:

food(banana,99).

и т.д.

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

multiple(X) :- food( _ ,X), food( _ ,X).

вернет true, если в базе данных есть только один элемент с ценой X. Я понимаю, в чем проблема (что он дважды находит один и тот же элемент и возвращает true), но я не понимаю, как написать запрос, который найдет два или более уникальных предметов из еды.

Я пытался написать «уникальное» правило следующим образом:

multiple(X) :- food(Y,X), food(Z,X), unique(Y,Z).
unique(Y,Z) :- Y /= Z

Но, похоже, это не сработает.

Спасибо.

1 Ответ

6 голосов
/ 29 февраля 2012

«Не равно» написано \=, а не /=, в стандартном прологе.Ваше решение должно работать:

?- [user].
|: food(milk, 10).
|: food(banana, 99).
|: food(strawberry, 40).
|: food(bread, 40).
|: % user://2 compiled 0.00 sec, 664 bytes
true.

?- food(X, Price), food(Y, Price), X \= Y.
X = strawberry,
Price = 40,
Y = bread ;
X = bread,
Price = 40,
Y = strawberry ;
false.

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

food(X, Price), food(Y, Price), X @< Y.

, который использует порядок порядка @<, чтобы убедиться, что первый термин «меньше» второго (что означает, что они не равны).

...