首页 > 解决方案 > 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运营商内部调用。但是我在这里理解循环的“退出”应该由 match 子句的第一行给出,但是它不起作用。

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

Add + , Bra [], Implies =>

标签: recursionocaml

解决方案


在这段代码摘录中,一些值(比如说v)匹配Add (x,y)。特别是,有ymatch的情况Add (a, b)。这意味着v等于这个值:

Add (x, Add (a, b))

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

Add (x, Add (a, b))

在那里,v原样返回。

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


推荐阅读