我正在 Prolog 中從任何給定的數字 (F) 中進行編程,以將串列的偶數元素相乘;保留那些不是的值,開發了以下內容,實際上程式“編譯”沒有任何錯誤,但是在輸入值時它只回傳“false”,我哪里錯了?:
% base case
evenproduct(_,[],[]) :- !.
% recursive case
evenproduct(F,[X|Xs], [Y|Ys]) :-
Y is F*X,
X mod 2 =:= 0,
evenproduct(F, Xs, Ys), !.
謝謝!!
uj5u.com熱心網友回復:
你不應該使用削減(!目標)。Cuts 是一個高級 Prolog 概念,只有當您成為更高級的 Prolog 程式員時才有用。在此之前,削減只會讓你感到困惑。此外,削減通常不會使您的程式更頻繁地成功,但它們會使它更頻繁地失敗。你的問題是你的程式經常失敗!削減可能是您問題的一部分。
此外,您的程式總是回傳 false 也不太正確。看,它確實適用于某些輸入:
?- evenproduct(3, [2, 4, 6], Ys).
Ys = [6, 12, 18].
也就是說,如果給定的串列只包含偶數,則您的程式完全按預期作業。到目前為止做得很好!
您現在需要做的是在串列中的一個數字為奇數的情況下也使此成功。有一種使 Prolog 程式更頻繁地成功的主要方法:向某個謂詞添加更多子句。
evenproduct/3到目前為止,您的定義有兩個子句。也許到目前為止您看到的所有串列處理謂詞都恰好有兩個子句,一個用于“基本情況”,一個用于“遞回情況”。但是有幾個非遞回或幾個遞回子句是完全沒問題的,而且通常是非常必要的。在您的情況下,您可以將以下子句添加到您的程式中以使其作業:
evenproduct(F,[X|Xs], [Y|Ys]) :-
Y = X,
X mod 2 =:= 1,
evenproduct(F, Xs, Ys).
所以現在您總共將擁有三個子句,一個非遞回子句和兩個遞回子句。
現在也接受奇數:
?- evenproduct(3, [1, 2, 3, 7, 11, 22], Ys).
Ys = [1, 6, 3, 7, 11, 66] ;
false.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336745.html
