Prolog解析出现故障

Prolog解析出现故障,prolog,dcg,Prolog,Dcg,我的代码采用类似orlittrue、litX、X的表达式,并将其作为列表列表输出 tocnf(Tree, Expr) :- trans(Tree ,Expr, []). trans(lit(X)) -->bbool(X). trans(or(lit(X1),lit(X2))) --> bconj(X1), bdisj(X2). trans(and(lit(X1),lit(X2))) --> bbool(X1), bconj(X2). bdisj(Conj)

我的代码采用类似orlittrue、litX、X的表达式,并将其作为列表列表输出

 tocnf(Tree, Expr) :-
    trans(Tree ,Expr, []).

 trans(lit(X)) -->bbool(X).
 trans(or(lit(X1),lit(X2))) --> bconj(X1), bdisj(X2).
 trans(and(lit(X1),lit(X2))) --> bbool(X1), bconj(X2).

 bdisj(Conj) --> bconj(Conj).

 bconj(Bool) --> bbool(Bool).

 bbool(X) --> [[X]].
这段代码应该是

tocnf(lit(X),X) 
输出为

[[X]]
[[true],[X]].

并将其输出为

[[X]]
[[true],[X]].
问题是为什么我会这样做

  tocnf(or(lit(true), and(lit(X),lit(true))),X) 
它输出

 false.
预备赛 首先,关于样式的注意事项:您应该始终使用短语/2接口访问DCG,因此将tocnf/2写成:

这意味着程序出人意料地过于具体:如果我们希望成功,它就会失败

现在,我们对查询进行概括,以找到仍然失败的更简单的情况。这是完全可以接受的,因为您的程序是使用Prolog的单调子集编写的,强烈建议使用声明性调试

为了概括查询,我使用变量而不是一些子项。例如:

?- tocnf(or(lit(_), and(lit(X),lit(true))), X). false. 为了找到原因,我们首先加载librarydiadem:

因此,泛化是一个仍然失败的更普遍的目标。由于我们正在考虑的Prolog程序是完全纯单调的,我们知道每一个更具体的查询也会失败。因此,我建议您将重点放在这个更简单、更一般的案例上,这是在本例中自动找到的,也是我们在几个步骤之后手动找到的相同目标

学习Prolog时,意外失败是一个常见问题,自动声明式调试可以让您快速找到原因。

预备知识 首先,关于样式的注意事项:您应该始终使用短语/2接口访问DCG,因此将tocnf/2写成:

这意味着程序出人意料地过于具体:如果我们希望成功,它就会失败

现在,我们对查询进行概括,以找到仍然失败的更简单的情况。这是完全可以接受的,因为您的程序是使用Prolog的单调子集编写的,强烈建议使用声明性调试

为了概括查询,我使用变量而不是一些子项。例如:

?- tocnf(or(lit(_), and(lit(X),lit(true))), X). false. 为了找到原因,我们首先加载librarydiadem:

因此,泛化是一个仍然失败的更普遍的目标。由于我们正在考虑的Prolog程序是完全纯单调的,我们知道每一个更具体的查询也会失败。因此,我建议您将重点放在这个更简单、更一般的案例上,这是在本例中自动找到的,也是我们在几个步骤之后手动找到的相同目标


学习Prolog时,意外失败是一个常见问题,自动声明式调试可以让您快速找到原因。

谢谢mate mat,这很有帮助,我会找到解决方法。谢谢mate mat,这很有帮助,我会找到解决方法。 ?- tocnf(or(lit(_), and(lit(X),lit(_))), X). false. ?- tocnf(or(_, and(lit(X),lit(_))), X). false. ?- tocnf(or(_, and(_,lit(_))), X). false. ?- tocnf(or(_, and(_,_)), X). false. ?- tocnf(or(_, _), X). X = [[_G793], [_G795]]. ?- tocnf(or(_, and(_,_)), X). false. ?- tocnf(or(lit(true), and(lit(X),lit(true))), X). false. ?- use_module(library(diadem)). true. ?- tocnf(or(lit(true), and(lit(X),lit(true))), X).?Generalization. Generalization = tocnf(or(_, and(_, _)), _) .