Prolog 使用约束处理规则避免无限递归
我已经用SWI-Prolog编写了一组简单的约束。它使用两个相对简单的推理规则:Prolog 使用约束处理规则避免无限递归,prolog,constraint-programming,constraint-handling-rules,Prolog,Constraint Programming,Constraint Handling Rules,我已经用SWI-Prolog编写了一组简单的约束。它使用两个相对简单的推理规则: %If A means B, then B means A. means(A,B) ==> means(B,A). %If A means B and A means C, then B means C. means(A,B),means(A,C) ==> means(B,C). 我期望的意思是([3,is,equal,to,4],[3,equals,4])是真的,但它似乎导致了无限递归: :
%If A means B, then B means A.
means(A,B) ==> means(B,A).
%If A means B and A means C, then B means C.
means(A,B),means(A,C) ==> means(B,C).
我期望的意思是([3,is,equal,to,4],[3,equals,4])
是真的
,但它似乎导致了无限递归:
:- use_module(library(chr)).
:- chr_constraint means/2.
:- initialization(main).
means([A,equals,B],[A,'=',B]).
means([A,is,equal,to,B],[A,'=',B]).
means([A,equals,B],[A,and,B,are,equal]).
%These are the rules of inference for this program.
%If A means B, then B means A.
means(A,B) ==> means(B,A).
%If A means B and A means C, then B means C.
means(A,B),means(A,C) ==> means(B,C).
main :-
%This part works as expected. X = [3,'=',4].
means([3,is,equal,to,4],X),writeln(X),
%This statement should be true, so why does it produce an infinite recursion?
means([3,is,equal,to,4],[3,and,4,are,equal]).
我向这个程序添加了一个simpaging规则,但它仍然会导致出本地堆栈
错误:
:- use_module(library(chr)).
:- chr_constraint means/2.
:- initialization(main).
%These are the rules of inference for this program.
%If A means B, then B means A.
means(A,B) ==> means(B,A).
%If A means B and A means C, then B means C.
means(A,B),means(A,C) ==> means(B,C).
means(A,B) \ means(A,B) <=> true.
means(A,A) <=> true.
means([A,equals,B],[A,'=',B]).
means([A,is,equal,to,B],[A,'=',B]).
means([A,equals,B],[A,and,B,are,equal]).
main :-
%This part works as expected. X = [3,'=',4].
means([3,is,equal,to,4],X),writeln(X),
%This statement should be true, so why does it produce an infinite recursion?
means([3,is,equal,to,4],[3,and,4,are,equal]).
:-使用_模块(库(chr))。
:-chr_约束方式/2。
:-初始化(主)。
%这些是本程序的推理规则。
%如果A表示B,那么B表示A。
表示(A,B)=>表示(B,A)。
%如果A表示B,A表示C,那么B表示C。
意思是(A,B),意思是(A,C)=>意思是(B,C)。
表示(A,B)\n表示(A,B)为真。
表示(A,A)正确。
指([A,等于,B],[A,'=',B])。
指([A,is,equal,to,B],[A,'=',B])。
平均值([A,等于,B],[A,和,B,等于])。
主要内容:-
%这部分按预期工作。X=[3',=',4]。
指([3,是,等于,等于,4],X),写N(X),
%这个语句应该是真的,那么为什么它会产生无限递归呢?
平均值([3,is,equal,to,4],[3,and,4,are,equal])。
是否有可能重新编写推理规则,使其不会产生无限递归?请阅读可用的CHR文献,以了解有关CHR这些方面的更详细信息 例如,在编程提示中包含:
constraint\constraint true
因此,如果添加CHR simpagation规则,您的示例将按预期工作:
表示(A,B)\n表示(A,B)为真。
示例查询和结果:
?- means([3,is,equal,to,4],[3,and,4,are,equal]).
means([3, and, 4, are, equal], [3, is, equal, to, 4]),
means([3, is, equal, to, 4], [3, and, 4, are, equal]).
-平均值([3,is,equal,to,4],[3,and,4,are,equal])。
平均值([3,and,4,are,equal],[3,is,equal,to,4]),
平均值([3,is,equal,to,4],[3,and,4,are,equal])。
我添加了这个模拟规则,但是这个例子在SWI-Prolog中仍然不能像预期的那样工作。请生成一个简单的、自包含的测试用例,它的格式清晰,并显示:(1)程序,(2)查询,(3)实际结果和(4)预期结果。我更新了这个问题,显示此程序的修改版本,该版本会产生
本地堆栈外
错误。您必须首先或至少更早地放置simpagation规则。请阅读更多现有的CHR文献,了解它们是如何工作的,下次请更清楚地将您的程序与查询分开。将它们结合在一起会使成功编译程序变得不必要的困难。