gpt4 book ai didi

Prolog:将列表列表中每个元素的值加倍并返回一个列表

转载 作者:行者123 更新时间:2023-12-01 01:32:38 26 4
gpt4 key购买 nike

我需要编写一组子句,这些子句采用整数列表的列表并返回一个所有元素都翻倍的列表。

例如:

?- double([[1,2],[3]], X).
Yes
X = [2,4,6]

我有一组名为 mega_append 的子句,它们从列表列表中返回一个列表。

例如:
?- mega_append([[1,2],[3]], X).
Yes
X = [1,2,3]

这是我的进度(m_a 是 mega_append 的缩写):
double([],[]).
double(List,[H1|T1]) :-
m_a(List,[H2|T2]),
H1 is 2 * H2,
double(T2, T1).

我会试着解释我认为它是如何工作的。我将第一个列表展平并将其分成头部和尾部(H2 和 T2)。我将第二个列表分为头和尾(H1 和 T1)。我检查以确保 H1(加倍的值)等于 H2(原始值)的 2 倍。如果是,那么我检查列表的其余部分。最终,如果它们都正确匹配,我应该留下两个空列表,它们应该匹配第一个子句并返回 yes。

它在只有一个值时起作用(例如: double([[1]], X) )。任何人都可以对我做错了什么提供任何见解吗?我的逻辑或代码不正确吗?

最佳答案

您的问题是 T2 是单个列表,因此递归调用后的 List 不是列表列表。

要解决这个问题,您可以首先使用 mega_append 来展平列表,然后使用辅助谓词来处理展平的列表。
IE。 double 将如下所示:

double([],[]).
double(List,X) :-
m_a(List,FList),
double_aux(List, FList).

编辑:
这是一种只使用一个子句的方法,因为您想看到一个子句。
我建议使用辅助谓词。
double([],[]).
double([[]],[]).
double(List,[H1|T1]) :-
mega_append(List,[H2|T2]),
H1 is 2 * H2,
double([T2], T1).

关于Prolog:将列表列表中每个元素的值加倍并返回一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3800105/

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