使用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
。
我想念什么基本概念?
答案 0 :(得分:5)
写时:
assert(happy(mia)).
您正在(重新)定义谓词assert/1
,而不是像您对go/0
谓词的定义那样调用。因此,happy(mia)
不会从不添加到数据库中。由于谓词happy/1
被系统知道(由于dynamic/1
指令)但没有子句,因此查询失败。
大多数Prolog系统都会阻止重新定义标准的内置谓词。但是assert/1
是旧式/过时的谓词。这就解释了为什么SWI-Prolog不抱怨重新定义。始终使用标准assertz/1
谓词,而不要使用assert/1
。