我试图在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
。但我明白这里的"退出"循环的值应该由match子句的第一行给出,但是它不起作用。
Add + , Bra [], Implies =>
在此代码摘录中,某些值(假设v
)与Add (x,y)
匹配。特别地,存在y
与Add (a, b)
匹配的情况。这意味着v
等于这个值:
Add (x, Add (a, b))
但是,注意在这种情况下函数的返回值也是:
Add (x, Add (a, b))
这里,v
不变返回。
如果你的代码循环,直到没有更多的Add
(我不知道,因为代码是不完整的,请张贴一个最小的,可重复的例子),那么你的代码的这个分支产生一个固点,这可能解释无限循环。