Базовое использование динамических предикатов Prolog

с этой базой знаний, используя 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.

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


person Robin Andrews    schedule 13.03.2019    source источник


Ответы (1)


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

assert(happy(mia)).

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

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

person Paulo Moura    schedule 13.03.2019