【发布时间】:2016-07-26 11:16:08
【问题描述】:
我开始使用DLV(分离数据日志),并且在运行代码时,我有一条规则报告“规则不安全”错误。规则如下:
foo(R, 1) :- not foo(R, _)
我已阅读手册并看到“不允许循环依赖”。我想这就是为什么我被报告错误的原因,但我不确定这个语句对 DLV 有什么问题。最终目标是在未定义谓词的情况下进行某种初始化。
更准确地说,如果没有出现带有参数 R(以及其他任何内容)的 'foo',则使用参数 R 和 1 对其进行定义。一旦定义,则不应再次触发规则。所以,在我看来,这不是一个真正的递归。
欢迎任何有关如何解决此问题的 cmets!
我意识到我可能需要另一个谓词来匹配规则正文中的参数 R。像这样的:
foo(R, 1) :- not foo(R, _), bar(R)
既然如此,否则将无法知道是否没有出现 foo(R, _)。不知道我有没有说清楚。
无论如何,这也不起作用:(
【问题讨论】:
-
我对 asp 语义有点生疏,但是您的程序的一个特化是
foo(dummy,1) :- not foo(dummy,1).即 foo(dummy,1) 如果不在扩展中,它是否在扩展中?这对我来说听起来很矛盾。 -
我是 asp 新手,但几年前我玩过其他类似的语言。我的最终目标是找到一种方法来定义 foo(dummy, 1) 如果它还没有被定义。根据我对 DLV 的了解,我的印象是“not foo(.)”被认为是 negation-as-failure,这意味着它可以被解读为“如果没有证据表明 foo(.) 是真的”或在换句话说“foo(.) 没有出现”
-
据我所知,循环和否定的问题是你从一个空模型
{}开始,然后not foo(_)保持不变,然后你将模型扩展到{foo(1)}。但随后使用该规则的理由无效。那么两阶段方法呢?类似于bar(1) :- not foo(_). bar(X) :- foo(X).。 -
试过了,但仍然返回“规则不安全”错误。我认为问题在于将not和_结合起来。我刚刚尝试了我用一些东西而不是 _ 定义的规则,它工作正常。幸运的是,在这种情况下,我只希望这里有 3 个不同的值,但如果 _ 可以说是 256 个值呢?
标签: declarative datalog answer-set-programming