Пролог Динамические Предикаты Основное Использование - PullRequest
2 голосов
/ 13 марта 2019

с этой базой знаний, используя https://swish.swi -prolog.org

:- dynamic happy/1.

go:-
    assert(happy(mia)),
    write(happy(mia)).

, если я запускаю go., я получаю

happy(mia)
true

Если я простоиметь

:- dynamic happy/1.

assert(happy(mia)).

и запустить happy(mia), я получаю false.

Какую фундаментальную концепцию мне не хватает, пожалуйста?

1 Ответ

5 голосов
/ 13 марта 2019

Когда вы пишете:

assert(happy(mia)).

вы (ре) определяете предикат assert/1, а не , вызывающий это, как в вашем определении *Предикат 1009 *.Таким образом, happy(mia) никогда не добавляется в базу данных .Запрос не выполняется, так как предикат happy/1 известен системе (благодаря директиве dynamic/1), но не содержит предложений.

Большинство систем Prolog предотвращают переопределение стандартных встроенных предикатов.Но assert/1 является устаревшим / устаревшим предикатом.Это объясняет, почему SWI-Prolog не жалуется на переопределение.Всегда используйте стандартный предикат assertz/1 вместо assert/1.

...