You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:10:24