我还是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 回答
几乎总是在Prolog中,您可以使用两个子句在列表上编写谓词 .
用
F
当前结果,F2
更新结果,H
列表的头部远,T
列表的尾部,I
的初始值,以及R
的结果 .这种模式使用尾递归和累加器(在这种情况下为
F
),这种模式被认为是Prolog中最有效的模式之一 . (中间递归或返回累加器会增加调用堆栈并需要更多簿记) .如果是总和,则转换为:
我将把
maxPrime
留作练习,但它符合上述模式 .