私は半決定論的な機能を持っています。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 に節を追加しましたが、うまくいきませんでした。)
半決定論的でもあるパターンマッチングでこの述語を書く方法はありますか?