我有一個半決定論的函數。當我重寫它來使用模式匹配而不是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.水星的工作方式不同嗎?即使N是0,情況B是否會被調用? (我在案例B中添加了N \= 0
子句,希望能夠使謂詞半決定論,但是這不起作用。)
有沒有辦法用模式匹配來寫這個謂詞也是半決定論的?
謝謝,本。這是非常清楚和全面的。 – Evan