Prolog入门问题:输入整数N生成列表并拆分奇偶列表
解决Prolog中生成1到N列表并拆分奇偶的问题
你的问题核心是谓词参数没包含结果变量,所以调用后只返回逻辑成立的True,不会输出X和Y的值。下面是具体的解决方法:
1. 修正谓词结构
把结果变量X、Y加到谓词的参数列表里,这样查询时Prolog才会绑定并返回它们的值:
% 主谓词:输入N,输出奇数列表X、偶数列表Y separate_even_odd(N, X, Y) :- numlist(1, N, L), % 生成1到N的列表L separate_even_odd_list(L, X, Y). % 调用拆分列表的谓词
2. 实现拆分列表的谓词
这里提供两种实现方式,选你容易理解的就行:
方式一:递归实现(适合理解Prolog的递归逻辑)
% 边界条件:空列表的奇偶列表都是空 separate_even_odd_list([], [], []). % 处理偶数:当前元素能被2整除,加入偶数列表Y separate_even_odd_list([H|T], X, [H|Y]) :- 0 is H mod 2, separate_even_odd_list(T, X, Y). % 处理奇数:当前元素除以2余1,加入奇数列表X separate_even_odd_list([H|T], [H|X], Y) :- 1 is H mod 2, separate_even_odd_list(T, X, Y).
方式二:用内置函数简化(更简洁)
利用Prolog的include/3函数筛选符合条件的元素:
separate_even_odd(N, X, Y) :- numlist(1, N, L), include(is_odd, L, X), % 从L中筛选奇数到X include(is_even, L, Y). % 从L中筛选偶数到Y % 定义奇数判断规则 is_odd(Num) :- 1 is Num mod 2. % 定义偶数判断规则 is_even(Num) :- 0 is Num mod 2.
3. 测试调用
在Prolog解释器中输入:
separate_even_odd(5, X, Y).
会得到你期望的结果:
X = [1, 3, 5], Y = [2, 4]
内容的提问来源于stack exchange,提问作者Choirul R
相关产品推荐
相关产品推荐

