- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须编写一段代码,返回给定列表中严格大于给定整数的所有元素,它从左到右返回。我不能使用递归或除内置函数以外的任何其他函数: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/
我是一名优秀的程序员,十分优秀!