Prolog动态谓词的基本用法

时间:2019-03-13 09:05:42

标签: prolog prolog-assert

使用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 个答案:

答案 0 :(得分:5)

写时:

assert(happy(mia)).

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

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