gpt4 book ai didi

recursion - 如何在一个谓词中返回从右到左大于整数的所有元素?

转载 作者:行者123 更新时间:2023-12-01 23:40:55 24 4
gpt4 key购买 nike

我必须编写一段代码,返回给定列表中严格大于给定整数的所有元素,它从左到右返回。我不能使用递归或除内置函数以外的任何其他函数:append/3、append/2、member/2、select/3、reverse/2、findall/3、bagof/3、setof/3、sumlist/2

案例:

greater_list([1,9,2,8,3,7,12],7, X).
X = 12 ? ;
X = 8 ? ;
X = 9 ? ;
no

我可以用递归或帮助谓词来写它,但没有它们我不知道如何开始。我可以使用 findall/3 但它不会逐个元素返回,而是返回大于给定数字的元素列表。

最佳答案

I can write it with recursion or help predicates, but without them I do not know how to start.

我很想知道您认为如何使用辅助谓词解决此问题,但并非没有辅助谓词。

但首先,考虑一下:您需要做的是枚举列表的某些 元素。也就是说,枚举列表中具有某些属性的元素。

因此,首先,您需要知道如何枚举列表的元素。一旦您知道如何做到这一点,您就可以担心它们必须满足的属性。

您可以使用 member/2 枚举列表元素:

?- member(X, [1,9,2,8,3,7,12]).
X = 1 ;
X = 9 ;
X = 2 ;
X = 8 ;
X = 3 ;
X = 7 ;
X = 12.

现在,我们要枚举元素,但只枚举满足属性 X > 7 的元素。这相当于说“X 是列表的成员, X > 7”。在 Prolog 中,(类似于)“and”用逗号 (,) 书写:

?- member(X, [1,9,2,8,3,7,12]), X > 7.
X = 9 ;
X = 8 ;
X = 12.

您的谓词应该采用可变限制,而不是对 7 的限制进行硬编码。这将类似于:

?- Limit = 7, member(X, [1,9,2,8,3,7,12]), X > Limit.
Limit = 7,
X = 9 ;
Limit = 7,
X = 8 ;
Limit = 7,
X = 12.

将其打包到谓词定义中将使您入门。此处枚举元素的顺序看起来与预期的相反。也许你的一个内置插件可以帮助你解决这个问题......

(此外,如果您知道如何使用 findall 编写此代码,则可以使用 member 枚举 findall 的元素' ed 列表。但是一般情况下,您不应该养成使用 findall 的习惯,如果所需的解决方案甚至不是列表,则尤其是不要养成这样的习惯。初学者和糟糕的老师倾向于过分强调将事情放在列表中,因为这是你在较小的编程语言中必须做的事情。让你自己从用其他语言思考中解放出来,即使你的老师不会。)

关于recursion - 如何在一个谓词中返回从右到左大于整数的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64984383/

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