首页 > 解决方案 > Prolog 动态谓词基本用法

问题描述

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

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

标签: prologprolog-assert

解决方案


当你写:

assert(happy(mia)).

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

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


推荐阅读