Prolog 动态谓词基本用法

Prolog Dynamic Predicates Basic Usage

使用此知识库 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

请问我缺少什么基本概念?

当你写:

assert(happy(mia)).

您正在(重新)定义谓词assert/1,而不是调用谓词go/0谓词。因此,happy(mia) 从未 添加到数据库中。查询失败,因为系统知道谓词 happy/1(感谢 dynamic/1 指令)但没有子句。

大多数 Prolog 系统阻止重新定义标准内置谓词。但是 assert/1 是一个 legacy/deprecated 谓词。这解释了为什么 SWI-Prolog 不抱怨重新定义。始终使用标准 assertz/1 谓词而不是 assert/1.