gpt4 book ai didi

recursion - 如何编写 Prolog 谓词将列表拆分为成对元素列表?

转载 作者:行者123 更新时间:2023-12-04 04:53:14 25 4
gpt4 key购买 nike

这是我做的样本考试中的一个问题。

给出 Prolog 谓词 split_into_pairs 的定义,该谓词将列表作为参数并作为结果返回由成对元素组成的列表。例如,split_into_pairs([1,2,3,4,5,6],X)结果会返回 X=[[1,2],[3,4],[5,6]] .同样,split_into_pairs([a,2,3,4,a,a,a,a],X)将作为结果返回 X=[[a,2],[3,4],[a,a],[a,a]]split_into_pairs([1,2,3],X)会返回 No .

我相信它并不意味着使用内置谓词来完成,但它也不应该太复杂,因为它只值 8/120 分。

我不确定它应该为包含两个元素的列表做什么,所以我想要么没有指定它返回 no,要么 split_into_pairs([A,B],[[A,B]]) .

我的主要问题是如何正确地进行递归调用,没有额外的括号,而不是像 X=[[A,B],[[C,D],[[E,F]]]] 那样结束。 ?.

我最近的尝试是下面代码的变体,但显然这是不正确的。

split_into_pairs([A,B],[A,B])
split_into_pairs([A,B|T], X) :- split_into_pairs(T, XX), X is [A,B|XX]

最佳答案

这是一个相对简单的递归:

split_into_pairs([], []).
split_into_pairs([First, Second | Tail], [[First, Second] | Rest]) :-
split_into_pairs(Tail, Rest).

第一条规则表示一个空列表已经被拆分成对;第二个要求源列表至少有两个项目,将它们配对,并在它们后面插入配对尾部列表的结果。

这是一个 demo on ideone .

您的解决方案 could be fixed as well通过在结果中添加方括号,并将规则的第二部分移动到标题中,如下所示:
split_into_pairs([A,B],[[A,B]]).
split_into_pairs([A,B|T], [[A,B]|XX]) :- split_into_pairs(T, XX).

请注意,此解决方案不会将空列表视为对列表,因此 split_into_pairs([], X)会失败。

关于recursion - 如何编写 Prolog 谓词将列表拆分为成对元素列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17112260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com