Prolog动态谓词的基本用法

Rob*_*bin 2 prolog prolog-assert

使用https://swish.swi-prolog.org获得此知识库

:- dynamic happy/1.

go:-
    assert(happy(mia)),
    write(happy(mia)).
Run Code Online (Sandbox Code Playgroud)

如果我跑步go.我会得到

happy(mia)
true
Run Code Online (Sandbox Code Playgroud)

如果我有

:- dynamic happy/1.

assert(happy(mia)).
Run Code Online (Sandbox Code Playgroud)

跑步happy(mia),我得到false

我想念什么基本概念?

Pau*_*ura 5

当你写:

assert(happy(mia)).
Run Code Online (Sandbox Code Playgroud)

您正在(重新)定义谓词assert/1,而不是像谓词定义中那样调用go/0。因此,happy(mia)永远不会添加到数据库中。查询失败,因为happy/1系统已知道该谓词(由于dynamic/1伪指令),但是没有子句。

大多数Prolog系统会阻止重新定义标准内置谓词。但是assert/1是旧式/过时的谓词。这就解释了为什么SWI-Prolog不抱怨重新定义。始终使用标准assertz/1谓词代替assert/1