我可以用递归或帮助谓词来编写它,但没有它们我不知道如何开始。
我很想知道您认为如何使用辅助谓词解决这个问题,但不是没有。
但首先,考虑一下:您需要做的是枚举列表的某些元素。也就是说,枚举列表中具有某些属性的元素。
首先,您需要知道如何枚举列表的元素。一旦您知道如何做到这一点,您就可以担心他们必须履行的财产。
你可以使用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.
将其打包在谓词定义中将使您开始。看起来这里枚举元素的顺序是预期的reverse。也许您的一个内置插件可以帮助您解决这个问题...
(另外,如果您知道如何使用findall 编写此代码,则可以使用member 枚举findall ed 列表的元素。但您不应该养成使用@ 的习惯一般为 987654333@,尤其是如果所需的解决方案甚至不是列表,则不会。初学者和糟糕的老师往往过分强调将事物放入列表中,因为这是您在较小的情况下必须做的编程语言。即使你的老师不能,也不要用其他语言思考。)