Введение предикатов в пролог - PullRequest
0 голосов
/ 22 сентября 2018

Мы начинаем с пустой базы данных и даем следующие команды

assert(q(a,b)),assertz(q(1,2)),asserta(q(foo,blug)).

Что теперь содержит база данных?

Что происходит послеследующие команды?

retract(q(1,2)),assertz((p(X):-h(X))).

Наконец, что происходит после следующей команды?

retract(q(_,_)),fail.

MyAttempt

Я ввел следующие команды в Prolog

assert(q(a,b)).

assertz(q(1,2)).

asserta(q(foo,blug)).

но отмечена ошибка о том, что q должен иметь параметр 1, а не 2.

Может кто-нибудь помочь мне?Как я могу это исправить?Буду признателен за любую помощь

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

fail в retract(q(_,_)),fail. делает цикл до тех пор, пока в базе данных не останется больше q/2 s.

Как это работает, Пролог хочет доказать, что цель ему дана;поэтому, когда наша цель заканчивается явным fail, то fail всегда терпит неудачу, поэтому общая цель тоже терпит неудачу;но Пролог хочет доказать это и поэтому продолжает пытаться доказать это, поэтому он "повторяет" любые точки выбора любых выдающихся целей, которые все еще находятся "над" этим fail.

Проще говоря, он повторяет цель retract(q(_,_)).

Каждая цель retract(q(_,_)) извлекает один экземпляр q/2 из нашей базы данных data .Таким образом, в этом отказоустойчивом цикле все они удаляются, и окончательный результат по-прежнему является ошибочным.

В чистом виде учитывается только этот результат - провал или успех цели.Но assert и retract виды предикатов призваны к их побочным эффектам , а не к их успеху или провалу.Их побочный эффект заключается в том, что они влияют на состояние нашей базы данных.

На самом деле, обычно цикл, управляемый сбоем, будет выглядеть как

retract(q(_,_)),fail ; true.

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

0 голосов
/ 24 сентября 2018

Изучив теорию, мы можем заключить следующее.

К первому вопросу:

q(foo,blug).

q(a,b).

q(1,2).

Ко второму вопросу

q(foo,blug).

q(a,b).

p(A):-h(A).

К третьему вопросу ядумаю, удаляет все предикаты q.Я не знаю, что здесь означает «потерпеть неудачу».

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