AI人工智能 查找素数
实例2:素数判断与生成
利用逻辑编程,我们可以从指定数字列表中筛选素数,也可以生成指定数量的素数,核心是将“素数的定义”转化为逻辑推理规则。
实现代码
## 导入所需库
from kanren import isvar, run, membero
from kanren.core import success, fail, goaleval, condeseq, eq, var
from sympy.ntheory.generate import prime, isprime
import itertools as it
## 定义素数判断的逻辑函数
def prime_check(x):
# 若x是逻辑变量,生成无限个素数进行匹配
if isvar(x):
return condeseq([(eq, x, p)] for p in map(prime, it.count(1)))
# 若x是具体数字,直接判断是否为素数
else:
return success if isprime(x) else fail
## 定义逻辑变量
x = var()
## 从指定数字列表中筛选素数
num_list = (12,14,15,19,20,21,22,23,29,30,41,44,52,62,65,85)
prime_in_list = set(run(0, x, (membero, x, num_list), (prime_check, x)))
print("列表中的素数:", prime_in_list)
## 生成前10个素数
first_10_prime = run(10, x, prime_check(x))
print("前10个素数:", first_10_prime)
输出结果
列表中的素数: {19, 23, 29, 41}
前10个素数: (2, 3, 5, 7, 11, 13, 17, 19, 23, 29)
核心逻辑
prime_check函数是逻辑推理的核心:若输入为逻辑变量,则持续生成素数;若为具体数字,则通过SymPy的isprime函数判断是否为素数;membero(x, num_list)表示“x是数字列表中的元素”,结合prime_check(x)实现“筛选列表中的素数”的逻辑。