【发布时间】:2017-03-17 13:37:43
【问题描述】:
我一直在阅读并注意到像 call 这样的谓词被称为元谓词,它们可以作为结果返回其他谓词(不知道 return 是否是一个很好的词在这里使用)例如这里:
assert(call(goal, X,Y)).
编辑:潜伏者叫我推理,这不起作用。
我知道它不应该调用谓词函数,但有没有办法对一个直到运行时才知道的谓词进行断言?
我想对多个 fact 使用相同的插入谓词,因此 assert(fact(X)) 不适合我的需要。我可以在运行时检索事实的名称,但如何在不直接统一事实的情况下使用断言?
【问题讨论】:
-
当你说
assert(call(goal, X, Y)).会起作用是什么意思?以什么方式工作?我看到的情况是尝试断言call(...)会导致尝试修改现有 Prolog 过程 (call) 时出错。 -
@lurker 你说得对,我的朋友,我很累,我以为我看到了它的工作。有没有一种方法可以在事先不知道断言需要哪个谓词的情况下进行断言?我会修改我的问题。对不起
-
不用担心。关于手头的问题:谓词只是一个 term 对吗?它看起来像
':-'(head, body)。所以你可以做assertz(':-'(Head, Body)).,其中Head和Body在运行时被实例化。您也可以将其写为assertz((Head :- Body)).,因为:-是一个运算符。请注意,Head和Body应在调用assertz/1时进行实例化。 -
Lurker,我会试试你的方法,我真的很喜欢这种语言。感谢您的意见,这肯定有助于进步。
标签: prolog meta-predicate