Prolog动态谓词的基本用法

Prolog动态谓词的基本用法,prolog,prolog-assert,Prolog,Prolog Assert,使用此知识库 如果我运行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指令),但没有子句 大多数P

使用此知识库

如果我运行
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
是一个遗留/不推荐的谓词。这解释了为什么SWI Prolog没有抱怨重新定义。始终使用标准的
assertz/1
谓词,而不是
assert/1

assert(happy(mia)).