如何正确编码规范化(A,B)?
How to encode normalized(A,B) properly?
我正在使用 clingo 解决家庭作业问题,偶然发现了一些我无法解释的问题:
normalized(0,0).
normalized(A,1) :-
A != 0.
normalized(10).
在我看来,当第一个参数为 0 或 1 时,normalized
应该为 0。
运行 依附于此,但是会产生以下内容:
test.pl:2:1-3:12: error: unsafe variables in:
normalized(A,1):-[#inc_base];A!=0.
test.pl:2:12-13: note: 'A' is unsafe
为什么A
这里不安全?
根据Programming with CLINGO
Some error messages say that the program
has “unsafe variables.” Such a message usually indicates that the head of one of
the rules includes a variable that does not occur in its body; stable models of such
programs may be infinite.
但在这个例子中 A
存在于体内。
clingo 会生成一个无限集,其中包含此处所有数字的答案吗?
我尝试在第一个参数周围添加 number(_)
并对其进行模式匹配以避免这种情况,但结果相同:
normalized(number(0),0).
normalized(A,1) :-
A=number(B),
B != 0.
normalized(number(10)).
我该如何正确地写 normalized
?
With "variables occurring in the body" 实际上是指正文中的正文。我可以推荐官方指南:https://github.com/potassco/guide/releases/
第二件事,ASP 不是序言。您的规则是扎根的,即每个一阶变量都被其域替换。在您的情况下 A
没有域。
您的计划的预期结果是什么?
normalized(12351,1).
normalized(my_mom,1).
都是 A
的有效替代品,因此您创建了一个无限程序。这就是 'A' 必须受域限制的原因。例如:
dom(a). dom(b). dom(c). dom(100).
normalized(0,0).
normalized(A,1) :- dom(A).
会产生
normalize(0,0).
normalize(a,1).
normalize(b,1).
normalize(c,1).
normalize(100,1).
另请注意,没有 number/1
这样的东西。 ASP 是一种无类型语言。
此外,
normalized(10).
是一个只有一个参数的不同谓词,我不知道它如何适合您的程序。
也许您正在寻找这样的东西:
dom(1..100).
normalize(0,0).
normalize(X,1) :- dom(X).
foo(43).
bar(Y) :- normalize(X,Y), foo(X).
我正在使用 clingo 解决家庭作业问题,偶然发现了一些我无法解释的问题:
normalized(0,0).
normalized(A,1) :-
A != 0.
normalized(10).
在我看来,当第一个参数为 0 或 1 时,normalized
应该为 0。
运行 依附于此,但是会产生以下内容:
test.pl:2:1-3:12: error: unsafe variables in:
normalized(A,1):-[#inc_base];A!=0.
test.pl:2:12-13: note: 'A' is unsafe
为什么A
这里不安全?
根据Programming with CLINGO
Some error messages say that the program has “unsafe variables.” Such a message usually indicates that the head of one of the rules includes a variable that does not occur in its body; stable models of such programs may be infinite.
但在这个例子中 A
存在于体内。
clingo 会生成一个无限集,其中包含此处所有数字的答案吗?
我尝试在第一个参数周围添加 number(_)
并对其进行模式匹配以避免这种情况,但结果相同:
normalized(number(0),0).
normalized(A,1) :-
A=number(B),
B != 0.
normalized(number(10)).
我该如何正确地写 normalized
?
With "variables occurring in the body" 实际上是指正文中的正文。我可以推荐官方指南:https://github.com/potassco/guide/releases/
第二件事,ASP 不是序言。您的规则是扎根的,即每个一阶变量都被其域替换。在您的情况下 A
没有域。
您的计划的预期结果是什么?
normalized(12351,1).
normalized(my_mom,1).
都是 A
的有效替代品,因此您创建了一个无限程序。这就是 'A' 必须受域限制的原因。例如:
dom(a). dom(b). dom(c). dom(100).
normalized(0,0).
normalized(A,1) :- dom(A).
会产生
normalize(0,0).
normalize(a,1).
normalize(b,1).
normalize(c,1).
normalize(100,1).
另请注意,没有 number/1
这样的东西。 ASP 是一种无类型语言。
此外,
normalized(10).
是一个只有一个参数的不同谓词,我不知道它如何适合您的程序。
也许您正在寻找这样的东西:
dom(1..100).
normalize(0,0).
normalize(X,1) :- dom(X).
foo(43).
bar(Y) :- normalize(X,Y), foo(X).