Как проверить, существует ли правило в базе данных предложений файла пролога - PullRequest
4 голосов
/ 26 ноября 2008

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

Идея состоит в том, чтобы использовать правило, заголовок которого проверен (+ имя, + аргументы). Это правило должно быть истинным, если в базе данных существует другое правило, заголовком которого является имя (аргументы)

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

Ответы [ 2 ]

5 голосов
/ 04 декабря 2008

Использование call/1 не очень хорошая идея, потому что call/1 на самом деле вызывает цель, но вы просто хотите узнать, существует ли факт / правило , и вы не хотите ждать после долгий расчет того, что вызов может сработать, и вы не хотите, чтобы что-то печаталось на экране, если вызываемое правило в свою очередь вызывает, например, writeln/1. Кроме того, вы бы хотели, чтобы verify/2 был успешным, даже если вызов не удался (но факт / правило в другом месте).

В качестве решения SWI-Prolog предлагает callable/1

callable(+Term)

True if Term is bound to an atom or a compound term,
so it can be handed without type-error to call/1, functor/3 and =../2.

Здесь представлены две версии verify/2, одна из которых использует call/1, а другая - callable/1.

verify1(Name, Arguments) :-
    Term =.. [Name | Arguments],
    call(Term).

verify2(Name, Arguments) :-
    Term =.. [Name | Arguments],
    callable(Term).

father(abraham, isaac) :-
    writeln('hello').

father(abraham, adam) :-
    fail.
1 голос
/ 27 ноября 2008

Вы знакомы с концепцией объединения? Что вам нужно сделать, это просто вызвать предикат, похожий на тот, который вы пытаетесь найти.

Итак, скажем, в вашей базе данных:

father(abraham,isaac).

Теперь вы хотите назвать что-то вроде:

verify(father,[abraham,isaac]).

Ваше тело предиката должно будет содержать механизм вызова father(abraham,isaac)., который затем должен возвращать true. Вызов father(abraham,adam) должен завершиться неудачей.

Для этого вам понадобятся два предиката: =../2 и call/2. Если вы используете SWI-Prolog, вызовите help(=..). и help(call) из командной строки переводчика для доступа к документации.

Надеюсь, я не испортил задание для вас. Вам все еще нужно выяснить, что делать с частично созданными экземплярами предикатов (так что, скажем, что-то вроде verify(father,[abraham,X]). по своему усмотрению, но это не должно быть сложно.

Удачи.

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