prolog - 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
。
请问我缺少什么基本概念?
解决方案
当你写:
assert(happy(mia)).
您正在(重新)定义谓词assert/1
,而不是像在谓词定义中那样调用go/0
它。因此,happy(mia)
永远不会添加到数据库中。查询失败,因为happy/1
系统知道谓词(感谢dynamic/1
指令)但没有子句。
大多数 Prolog 系统阻止重新定义标准内置谓词。但是assert/1
是一个遗留/不推荐使用的谓词。这就解释了为什么 SWI-Prolog 不抱怨重新定义。始终使用标准assertz/1
谓词而不是assert/1
.
推荐阅读
- nested - 意外行为嵌套字段 Big Query - 数据洞察
- android - 使用相机拍照会生成一个看起来像 Android 10 上的缩略图的图像文件
- scylla - Scylladb:Scylla 写入延迟随着时间的推移而增加,以进行连续批量写入摄取
- java - 单击 FAB 时使 Activity 变暗
- python - 安装 jupiter notebook 不起作用:启动器中的致命错误
- javascript - 谷歌浏览器在播放 audio.play() 方法时未捕获(承诺)DOMException
- typescript - 动态获取 Map 值的类型
- swift - Xcode 库尔德语本地化问题
- python - 我将如何修改它以将其放入函数中?
- c# - 为什么 Thread.Sleep 有效但 Task.Delay 无效?