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])是真的,但它似乎导致了无限递归: :

我已经用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])
真的
,但它似乎导致了无限递归:

:- 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这些方面的更详细信息

例如,在编程提示中包含:

  • 集合语义
  • 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文献,了解它们是如何工作的,下次请更清楚地将您的程序与查询分开。将它们结合在一起会使成功编译程序变得不必要的困难。