visual - prolog скачать



Как проверить, существует ли правило в базе данных proog-файла (2)

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

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

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


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

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

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]). самостоятельно, но отсюда не должно быть трудно.

Удачи.


Использование 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.