簡體   English   中英

列表中元素的總和 - Prolog

[英]Sum of elements in list - Prolog

我還是 SWI-Prolog 的新手,我不確定如何解決這兩個問題。

  1. 編寫一個謂詞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
  2. 編寫一個給定數字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練習,但它“很好”地融入了上述模式。

  1. 編寫一個謂詞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) .

./demos/parts/composites_sum.prolog.console

?- prime(1) .
true
?- prime(2) .
true
?- prime(3) .
true
?- prime(4) .
false
?- prime(5) .
true
?- prime(7) .
true


./src/parts/prime.prolog
 %! 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 .

./demos/parts/prime__1.prolog.console
 ?- prime(1) . true ?- prime(2) . true ?- prime(3) . true ?- prime(4) . false ?- prime(5) . true ?- prime(7) . true

./demos/parts/prime__2.prolog.console

?- 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.


./src/parts/composites.prolog
 %! 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) .

./demos/parts/composites.prolog.console
 ?- 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 = [] .

./src/parts/sum.prolog
 %! 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) .

./demos/parts/sum.prolog.console
 ?- 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM