如何在prolog中限制深度结构

如何在prolog中限制深度结构,prolog,Prolog,我试图写一个生成表达式的语法。如果我没有设置深度限制,递归将抛出最后一个变量,并且为无穷大。我不知道如何限制树递归的深度分支 我试试这个: 常数('c1')。 变量('v1')。 运算符(“+”)。 表达式(C):-常数(C)。 表达式(V):-变量(V)。 表达式(bin(E1,O,E2)):- 表达式(E1), 操作员(O), 表达(E2)。 expresionL(C,0):-常数(C)。 expresionL(V,0):-变量(V)。 expresionL(bin(E1,O,E2),N):

我试图写一个生成表达式的语法。如果我没有设置深度限制,递归将抛出最后一个变量,并且为无穷大。我不知道如何限制树递归的深度分支

我试试这个:

常数('c1')。
变量('v1')。
运算符(“+”)。
表达式(C):-常数(C)。
表达式(V):-变量(V)。
表达式(bin(E1,O,E2)):-
表达式(E1),
操作员(O),
表达(E2)。
expresionL(C,0):-常数(C)。
expresionL(V,0):-变量(V)。
expresionL(bin(E1,O,E2),N):-
N_1是N-1,
expresionL(E1,N_1),
操作员(O),
expresionL(E2,N_1)。
这是一本书

如果我查询
Expresion(X)
y,则获得:

X = c1
X = v1
X = bin(c1, (+), c1)
X = bin(c1, (+), v1)
X = bin(c1, (+), bin(c1, (+), c1))
X = bin(c1, (+), bin(c1, (+), v1))
X = bin(c1, (+), bin(c1, (+), bin(c1, (+), c1)))
…去英菲尼和其他地方!(在las表达式上递归)。我从未见过
v1

我写的
expresionL
是一个深度受限的表达式版本

如果我查询
expresion(bin('v1','+','c1')。
或查询
expresion(bin('v1','+','c1')。
我得到
true

如果我查询expresionL(X,1)。我得到:

X = bin(c1, (+), c1)
X = bin(c1, (+), v1)
Stack limit (0.2Gb) exceeded
  Stack sizes: local: 0.2Gb, global: 51.1Mb, trail: 1Kb
  Stack depth: 1,673,655, last-call: 0%, Choice points: 13
  Possible non-terminating recursion:
    [1,673,655] expresionL(_1404, -1673622)
    [1,673,654] expresionL(<compound bin/3>, -1673621)
X=bin(c1,(+),c1)
X=箱(c1,(+),v1)
超出堆栈限制(0.2Gb)
堆栈大小:本地:0.2Gb,全局:51.1Mb,跟踪:1Kb
堆栈深度:1673655,上次调用:0%,选择点数:13
可能的非终止递归:
[1673655]表达式(_1404,-1673622)
[1673654]表达式(,-1673621)
我没有在任何答案的
bin
的第一个参数中看到
v1
。inifite递归不会停止

如何编写一个
expresion(E,N)
版本,将递归限制为N个步骤? 注:


  • 我知道我的试用版计算精确的N级深度,我希望
    问题是,即使
    n0
    ,也允许递归计算表达式

    将其添加到代码中:

    expresionL(C, 0) :- constant(C).
    expresionL(V, 0) :- variable(V).
    expresionL(bin(E1,O,E2), N) :- 
        N > 0, # select this rule only when the others fail
        N_1 is N-1, 
        expresionL(E1, N_1), 
        operator(O), 
        expresionL(E2, N_1).
    
    结果:

    ?- expresionL(X,1).
    X = bin(c1, +, c1) ;
    X = bin(c1, +, v1) ;
    X = bin(v1, +, c1) ;
    X = bin(v1, +, v1) ;
    false.
    

    问题是,即使
    n0
    ,也允许递归计算表达式

    将其添加到代码中:

    expresionL(C, 0) :- constant(C).
    expresionL(V, 0) :- variable(V).
    expresionL(bin(E1,O,E2), N) :- 
        N > 0, # select this rule only when the others fail
        N_1 is N-1, 
        expresionL(E1, N_1), 
        operator(O), 
        expresionL(E2, N_1).
    
    结果:

    ?- expresionL(X,1).
    X = bin(c1, +, c1) ;
    X = bin(c1, +, v1) ;
    X = bin(v1, +, c1) ;
    X = bin(v1, +, v1) ;
    false.
    

    在这里,我发布带有您建议的最终解决方案和
    expresion(E,N):-N>0,expresion(E,0)
    以实现
    N>0
    :在这里,我发布带有您建议的最终解决方案和
    expresion(E,N):-N>0,expresion(E,0)
    以实现
    N>0
    :为什么不编写语法?这是错误的,欢迎提出建议。我30年没写序言了。为什么不写一篇语法呢?这是错误的,欢迎提出建议。我30年没写序言了。