转载自:https://mp.weixin.qq.com/s/ejK-u7Sc-inTZAmUd9wfiQ
4、在给定整数范围内,构造一个该范围的所有质数的列表。
1 :- ensure_loaded(p2_01).
2
3 prime_list(A,B,L) :-
4 A =< 2, %
5 !,
6 p_list(2,B,L).
7 prime_list(A,B,L) :-
8 A1 is (A // 2) * 2 + 1,
9 p_list(A1,B,L).
10
注释行:
1. % 确保载入 is_prime/1谓词
2. 空行
3. %列表是A到B范围的质数的列表
4. 限定数值A是小于等于二的
5. 截断
6. %将小于等于2的数设置为2
7.
8. %过滤掉偶数
9. %去处理表
10. 空行
11 p_list(A,B,[]) :-
12 A > B,
13 !.
14 p_list(A,B,[A|L]) :-
15 is_prime(A),
16 !,
17 next(A,A1),
18 p_list(A1,B,L).
19 p_list(A,B,L) :-
20 next(A,A1),
21 p_list(A1,B,L).
22
注释行:
11. %当超出范围
12. %截断,递归终止
13. 截断
14.
15. %判断是否为质数,如果A是质数则继续
16. 截断
17. %继续处理后续的数
18. %继续处理后续的质数
19. %A不是质数的情况
20. %继续处理后续的数
21. %继续处理后续的质数
22. 空行
23 next(2,3) :-
24 !.
25 next(A,A1) :-
26 A1 is A + 2.
23. %质数的起始数,也是终止条件
24. %截断
25.
26. %继续后续数值
结果如下:
?- prime_list(1,100,L),write(L).
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
L = [2, 3, 5, 7, 11, 13, 17, 19, 23|…].
5、哥德巴赫的猜想说:每个大于2的正偶数是两个质数之和。例如:28 = 5 +23。这是数论中最著名的事实之一,在一般情况下还没有被证明是正确的。从数字上已经证实了数量很的大它(比我们Prolog系统所能容纳的数量大得多)。编写一个谓词,以找到两个总和为给定偶数整数的质数。
1 :- ensure_loaded(p2_01).
2
3 goldbach(4,[2,2]) :-
4 !.
5 goldbach(N,L) :-
6 N mod 2 =:= 0,
7 N > 4,
8 goldbach(N,L,3).
9
注释行:
1. 确保装入is_prime/1谓词
2. 空行
3. 证明的大的偶数从4开始
4. 截断<