首页 文章

列表中的元素总和 - Prolog

提问于
浏览
0

我还是SWI-Prolog的新手,我不知道怎么做这两个问题 .

  • 写一个谓词 sum_composite(Numbers, Sum) ,它只是一个非负整数列表的复合数 . 例:
?- sumList([1,3,5,2,4,6,8,7],Sum).
Sum=18.
true
  • 写一个给出数字列表的谓词 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).

1 回答

  • 0

    几乎总是在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 留作练习,但它符合上述模式 .

相关问题