List 列表中元素的总和-Prolog

List 列表中元素的总和-Prolog,list,prolog,List,Prolog,我对SWI Prolog还是新手,我不知道如何解决这两个问题 编写一个谓词sum\u composite(Numbers,sum),该谓词只对非负整数列表中的复合数求和。例如: ?- sumList([1,3,5,2,4,6,8,7],Sum). Sum=18. true ?- maxPrime([1, -4, 7, 4, 7, 9, -2, 3], Max). Max = 7 true 编写一个谓词maxPrime(List,Min),该谓词给定一个数字列表,返回列表中的最大素数元素。例

我对SWI Prolog还是新手,我不知道如何解决这两个问题

  • 编写一个谓词
    sum\u composite(Numbers,sum)
    ,该谓词只对非负整数列表中的复合数求和。例如:

    ?- sumList([1,3,5,2,4,6,8,7],Sum).
    Sum=18.
    true
    
    ?- maxPrime([1, -4, 7, 4, 7, 9, -2, 3], Max).
    Max = 7
    true
    
  • 编写一个谓词
    maxPrime(List,Min)
    ,该谓词给定一个数字列表,返回列表中的最大素数元素。例如:

    ?- sumList([1,3,5,2,4,6,8,7],Sum).
    Sum=18.
    true
    
    ?- 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\u sum(NUMBERs,sum)
    ,它只对非负整数列表中的复合数求和
  • (ed:“复合”数是指不是“质数”的数)

    例如:

    ?- composites_sum([1,3,5,2,4,6,8,7],Sum) .
    Sum = 18 .
    true
    
    回答 ./src/零件/复合材料\u sum.prolog

    /演示/零件/复合材料\u sum.prolog.console

    ./src/parts/prime.prolog

    ./demos/parts/prime\u 1.prolog.console

    ./demos/parts/prime\u 2.prolog.console

    ./src/parts/composites.prolog

    ./demos/parts/composites.prolog.console

    ./src/parts/sum.prolog

    ./demos/parts/sum.prolog.console


    我只能在整数列表中算出整数的和。总和列表([],0)//空列表。sum|list([First | Tail],sum):-sumlist(Tail,SumTail)。因此,您需要在某处添加一个测试,以检查一个数字是否是复合的(无论这意味着什么),并有条件地求和。请参阅关于if-then-else控件构造的SWI Prolog文档。哦,好的。当然谢谢。对于素数检查,可能存在的副本,您可以搜索
    [prolog]prime
    。给你。
    
    %! 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
    
    
    
    ?- between(1,1000,N) , prime(N) .
    N = 1 ? ;
    N = 2 ? ;
    N = 3 ? ;
    N = 5 ? ;
    N = 7 ? ;
    N = 11 ? ;
    N = 13 ? ;
    N = 17 ? ;
    N = 19 ? ;
    N = 23 ? ;
    N = 29 ? ;
    N = 31 ? ;
    N = 37 ? ;
    N = 41 ? ;
    N = 43 ? ;
    N = 47 ? ;
    N = 53 ? ;
    N = 59 ? ;
    N = 61 ? ;
    N = 67 ? ;
    N = 71 ? %etcetera.
    
    
    
    %! 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.