如何正确编码规范化(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).