我正在尝试使用以下代码在 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中程序进入无限循环。
+(p,[] z)
它返回 [](p => z)
+(p,+(q,[] z))
它应该返回 [](p => (q => z))
,而不是进入永无止境的循环。
我可以看到案例 2 的问题是因为我在另一个 Add
运算符中调用 Add
。但是我在这里理解循环的“退出”应该由匹配子句的第一行给出,但是它不起作用。
如果您有任何建议,我将不胜感激。 只是为了澄清,我正在使用运算符的下一个语法
Add + , Bra [], Implies =>
答案 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),那么你的代码的这个分支会产生一个修复点,这可以解释无限循环。