我是 prolog 的新手,我找不到按 2 個條件過濾串列、將結果保存到 2 個變數然后根據它們評估答案的解決方案。
就我而言,如果串列包含更多大于 0 的數字,則數字小于 0。
例如,我得到一個包含元素的串列:
checklist([-2, 3.3, 12, -10.1, 14, -11, 123]) # true
checklist([-2.1, -3, -4, 14, 16.7]) # false
checklist([11.5, 2.5, -34.1, -1]) # false
我會在python中寫這樣的東西:
bigger_count = 0
lesser_count = 0
for num in list:
if num > 0:
bigger_count = 1
elif num < 0:
lesser_count = 1
print(bigger_count > lesser_count)
特別是我不明白如何一次使用 2 個變數。
uj5u.com熱心網友回復:
另一種可能的解決方案是:
check(List) :-
check(List, Balance),
Balance > 0.
check([], 0).
check([X|Xs], B) :-
check(Xs, B0),
( X > 0 -> B is B0 1
; X < 0 -> B is B0 - 1
; B is B0 ).
例子:
?- check([-2, 3.3, 12, -10.1, 14, -11, 123]).
true.
?- check([-2.1, -3, -4, 14, 16.7]).
false.
?- check([11.5, 2.5, -34.1, -1]).
false.
?- check([1,-1]).
false.
uj5u.com熱心網友回復:
最簡單的方法是使用帶有所需額外狀態的作業者謂詞。
checklist( Ns, P, N ) :- checklist(Ns, 0, 0, P, N )
checklist( [] , P , N , P , N ) .
checklist( [X|Xs] , P0 , N0 , P , N ) :- X > 0, P1 is P0 1, checklist(Xs,P1,N0,P,N).
checklist( [X|Xs] , P0 , N0 , P , N ) :- X < 0, B1 is N0 1, checklist(Xs,P0,N1,P,N).
uj5u.com熱心網友回復:
如果您將串列中的所有值相加,您將得到一個正數或負數結果,該結果因數字的大小而異,而不是有多少。有一個數學函式sign或signum將所有負值變為-1,所有正值變為 1,然后您可以將它們相加,如果有更多的正輸入,答案是肯定的,如果有更多的負輸入,則答案是否定的。否則它們將抵消,總和將為 0。
如果你maplist sign超過了輸入:
?- maplist(sign, [-2, 3.3, 12, -10.1, 14, -11, 123], X).
X = [-1, 1.0, 1, -1.0, 1, -1, 1]
然后:
?- sum_list(X, S).
S = 1.0
一個積極的結果,所以在這種情況下積極的比消極的多。
uj5u.com熱心網友回復:
您可以partition/4將輸入串列放入較小的值和較大的值中:
?- partition(>(0), [-2, 3.3, 12, -10.1, 14, -11, 123], Lesser, Greater).
Lesser = [-2, -10.1, -11],
Greater = [3.3, 12, 14, 123]
然后使用length/2并比較結果,看看哪個更長。
(如果任何輸入是 ,這可能沒有用0,它們不在您的示例中。我認為這將使用更多記憶體來制作串列的副本。)。
uj5u.com熱心網友回復:
https://www.swi-prolog.org/pldoc/doc_for?object=include/3
https://www.swi-prolog.org/pldoc/doc_for?object=convlist/3
如果你有 2 個條件,你需要遍歷串列兩次,但是可以處理兩個不同謂詞的代碼的復雜性值得麻煩嗎?
無論如何,如果你是從頭開始寫作,你可以通過使用 DCG 來簡化你的生活:
filter(_Pred, []) --> [].
filter(Pred, [X|Xs]) -->
( { call(Pred, X) }
-> [X]
; []
),
filter(Pred, Xs).
filter(Pred, List, Result) :-
phrase(filter(Pred, List), Result).
even(X) :- 0 is X mod 2.
?- filter(even, [1,2,3,4,5], X).
X = [2, 4]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/455053.html
上一篇:F#-使用匿名記錄遞回
下一篇:PHP用鍵展平多維陣列
