OCaml 中的递归调用

时间:2021-02-18 12:15:14

标签: recursion ocaml

我正在尝试使用以下代码在 OCaml 中实现递归调用:

| Add (x,y) -> 
  begin 
    match x, y with
        | x, Bra y ->  Bra (Implies(x, y))
        | x, Add (a, b) ->  Add(x, Add(a, b)) 
        | x, y ->  Implies(x, y)

  end  
  

用2种情况测试时,我发现在情况2中程序进入无限循环。

  1. +(p,[] z) 它返回 [](p => z)

  2. +(p,+(q,[] z)) 它应该返回 [](p => (q => z)) ,而不是进入永无止境的循环。

我可以看到案例 2 的问题是因为我在另一个 Add 运算符中调用 Add。但是我在这里理解循环的“退出”应该由匹配子句的第一行给出,但是它不起作用。

如果您有任何建议,我将不胜感激。 只是为了澄清,我正在使用运算符的下一个语法

Add + , Bra [], Implies =>

1 个答案:

答案 0 :(得分:2)

在此代码摘录中,某些值(假设为 v)与 Add (x,y) 匹配。特别是,存在 y 匹配 Add (a, b) 的情况。这意味着 v 等于这个值:

Add (x, Add (a, b))

但是,请注意,在这种情况下,您的函数的返回值也是:

Add (x, Add (a, b))

那里,v 原样返回。

如果你的代码循环直到没有更多的 Add(我不知道,因为代码不完整,请发布一个 Minimal, Reproducible Example),那么你的代码的这个分支会产生一个修复点,这可以解释无限循环。

相关问题