Как проверить, существует ли правило в базе данных предложений файла пролога

StackOverflow https://stackoverflow.com/questions/321974

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

Удачи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top