我有一个半确定性的功能。当我重写它以使用模式匹配而不是 if 语句时,Mercury 说它变得不确定。我想了解为什么。
原代码:
:- pred nth(list(T), int, T).
:- mode nth(in, in, out) is semidet.
nth([Hd | Tl], N, X) :- (if N = 0 then X = Hd else nth(Tl, N - 1, X)).
修改后的代码:
:- pred nth(list(T), int, T).
:- mode nth(in, in, out) is nondet.
nth([Hd | _], 0, Hd). % Case A
nth([_ | Tl], N, X) :- N \= 0, nth(Tl, N - 1, X). % Case B
我习惯于考虑 SML 中的模式匹配,其中情况 A 中的 0 将确保情况 B 中 N 不为 0。Mercury 的工作方式是否不同?即使 N 为 0,案例 B 也会被调用吗?(我在N \= 0
案例 B 中添加了该子句,希望使谓词具有半确定性,但这没有用。)
有没有办法用也是半确定性的模式匹配来编写这个谓词?