Как проверить, существует ли правило в базе данных предложений файла пролога
-
11-07-2019 - |
Вопрос
Я работаю над заданием колледжа, где я должен проверить, существует ли определенный пункт (как факт или как правило) в текущей базе данных предложений.
Идея состоит в том, чтобы использовать правило, заголовок которого проверен (+ name, + arguments). Это правило должно быть истинным, если в базе данных существует другое правило, заголовком которого является имя (аргументы)
Любая помощь будет принята с благодарностью ...
Решение
Использование 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.
Другие советы
Вы знакомы с концепцией объединения? Вам нужно просто вызвать предикат, похожий на тот, который вы пытаетесь найти.
Итак, скажем, в вашей базе данных есть:
father(abraham,isaac).
Теперь вы хотите позвонить примерно так:
verify(father,[abraham,isaac]).
Тогда ваше тело предиката должно содержать механизм вызова папа (abraham, isaac).
, который затем должен возвращать true.
Вызов папа (abraham, адам)
должен потерпеть неудачу.
Для этого вам понадобятся два предиката: = .. / 2
и call / 2
. Если вы используете SWI-Prolog, вызовите help (= ..).
и help (call)
из командной строки переводчика, чтобы получить доступ к документации.
Я надеюсь, что не испортил задание для вас. Вы все еще должны выяснить, что делать с частично созданными экземплярами предикатов (так, скажем, что-то вроде verify (папа, [abraham, X]).
самостоятельно, но это не должно быть трудно отсюда . р>
Удачи.