[英]Sum of elements in list - Prolog
我還是 SWI-Prolog 的新手,我不確定如何解決這兩個問題。
編寫一個謂詞sum_composite(Numbers, Sum)
, sum_composite(Numbers, Sum)
對非負整數列表的復合sum_composite(Numbers, Sum)
。 例子:
?- sumList([1,3,5,2,4,6,8,7],Sum). Sum=18. true
編寫一個給定數字maxPrime(List, Min)
的謂詞maxPrime(List, Min)
,返回列表中的最大素數元素。 例子:
?- maxPrime([1, -4, 7, 4, 7, 9, -2, 3], Max). Max = 7 true
這是我到目前為止:
sum_list([],0). //empty list.
sum_list([First|Tail],Sum) :-
sumlist(Tail, SumTail).
幾乎總是在 Prolog 中,您可以使用兩個子句在列表上編寫謂詞。
foo(L,R) :-
foo(L,I,R).
foo([],F,F).
foo([H|T],F,R) :-
F2 is f(F,H),
foo(T,F2,R).
F
是當前結果, F2
是更新后的結果, H
是那么遠的列表的頭部, T
是列表的尾部, I
是初始值, R
是結果。
這種模式使用帶有累加器(在本例中為F
)的尾遞歸,這種模式被認為是 Prolog 中最有效的模式之一。 (中間遞歸或返回累加器會增加調用堆棧並需要更多的簿記)。
在總和的情況下,這被轉換為:
sum(L,R) :-
sum(L,0,R).
sum([],F,F).
sum([H|T],F,R) :-
F2 is F+H,
sum(T,F2,R).
我將把maxPrime
練習,但它“很好”地融入了上述模式。
composites_sum(NUMBERs, SUM)
, composites_sum(NUMBERs, SUM)
非負整數列表的 ONLY COMPOSITE NUMBERS 求和。(ed:“復合”數是不是“質數”的數)。
例子 :
composites_sum(NUMBERs0,SUM)
:-
composites(NUMBERs0,NUMBERs) ,
sum(NUMBERs,SUM)
.
回答 ./src/parts/composites_sum.prolog
composites_sum(NUMBERs0,SUM) :- composites(NUMBERs0,NUMBERs) , sum(NUMBERs,SUM) .
?- prime(1) .
true
?- prime(2) .
true
?- prime(3) .
true
?- prime(4) .
false
?- prime(5) .
true
?- prime(7) .
true
%! prime(N0) % % true if `N0` is an prime number ; % false if `N0` is not an prime number . % % this predicate can be used to generate prime numbers ; % see the demos for the example using `between` . /* If an number is divisible by any other number less than it's sqrt then the number is not prime ; otherwise it is prime . */ :- op(1,'xfy','prime_') . prime(N0) :- [start] prime_ (N0) . [start] prime_ (N0) :- [init] prime_ (N0) . [init] prime_ (N0) :- K is floor(sqrt(N0)) , [while] prime_ (N0,K) . [while] prime_ (_N0,K0) :- K0 = 1 , ! , [finish] prime_ (true) . [while] prime_ (N0,K0) :- 0 is mod(N0,K0) , % true if K0 multiplied by some value is N0 . ! , [finish] prime_ (false) . [while] prime_ (N0,K0) :- ! , K is K0 - 1 , [while] prime_ (N0,K) . [finish] prime_ (true) . [finish] prime_ (false) :- false .
?- prime(1) . true ?- prime(2) . true ?- prime(3) . true ?- prime(4) . false ?- prime(5) . true ?- prime(7) . true
?- sum([1,2,3,4],SUM).
SUM = 10.
?- sum([1,2],SUM).
SUM = 3.
?- sum([1,2,-1],SUM).
SUM = 2.
?- sum([-1],SUM).
SUM = -1.
?- sum([],SUM).
SUM = 0.
%! composites(Xs0,Ys) % % `Ys` is those elements of `Xs0` that are not prime . composites([],[]) :- ! . composites([X0|Xs],[X0|Ys]) :- + prime(X0) , ! , composites(Xs,Ys) . composites([_X0|Xs],Ys0) :- ! , composites(Xs,Ys0) .
?- composites([1,2,3,4,5,6,7,8,9,10,11,12],Cs) . Cs = [4,6,8,9,10,12] . ?- composites([1],Cs) . Cs = [] . ?- composites([],Cs) . Cs = [] .
%! sum(Xs,SUM) % % calculate the total sum of the items of list `Xs` . sum(Xs,SUM) :- sum(Xs,0,SUM) . sum([],SUM0,SUM0) . sum([X0|Xs],SUM0,SUM) :- SUM1 is SUM0 + X0 , sum(Xs,SUM1,SUM) .
?- sum([1,2,3,4],SUM). SUM = 10. ?- sum([1,2],SUM). SUM = 3. ?- sum([1,2,-1],SUM). SUM = 2. ?- sum([-1],SUM). SUM = -1. ?- sum([],SUM). SUM = 0.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.