Recursion 如何在prolog中从右向左返回一个谓词中大于整数的所有元素?

Recursion 如何在prolog中从右向左返回一个谓词中大于整数的所有元素?,recursion,prolog,Recursion,Prolog,我必须编写一个代码,返回给定列表中严格大于给定整数的所有元素,它从左到右返回。除了内置函数外,我不能使用递归或任何其他函数: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 我可以用递归或帮助谓词编写它,但是如果没有它们,

我必须编写一个代码,返回给定列表中严格大于给定整数的所有元素,它从左到右返回。除了内置函数外,我不能使用递归或任何其他函数: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,但它不会逐个返回元素,而是返回大于给定数量的元素列表

我可以用递归或帮助谓词编写它,但是如果没有它们,我不知道如何开始

我很感兴趣的是,您认为如何使用helper谓词解决这个问题,而不是不使用helper谓词

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

因此,首先,您需要知道如何枚举列表中的元素。一旦你知道如何做到这一点,你就可以担心他们必须履行的财产

您可以使用
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”是用逗号(
)编写的:

您的谓词应该接受一个变量限制,而不是硬编码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
的习惯,尤其是如果所需的解决方案甚至不是一个列表,就不应该这样做。初学者和差劲的教师倾向于过分强调将内容放在列表中,因为这是在较少的编程语言中必须做的。不要用其他语言思考,即使你的老师不能这样做。)

你可以用它来获取所需元素的列表,然后用
member/2
枚举该列表的成员:

更大列表(L、限制、X):-
findall(E,(成员(E,L),E>限制),Es,
成员(X,Es)。
然后:

?-更大的列表([1,9,2,8,3,7,12],7,X)。
X=9;
X=8;
X=12。
?-更大的列表([],7,X)。
错。
以迂回的方式:

?-findall(X,更大的列表([1,9,2,8,3,7,12],7,X),Xs)。
Xs=[9,8,12]。
NB.这依赖于递归,我没有注意到您一开始不能使用它

<>而不是反转列表,你可以在没有其他辅助谓词的情况下编写谓词,并首先考虑递归的情况。这确保了第一个元素被检查为<代码> n>代码>将是列表的最后一个元素。
greater_list([_|L], N, X) :- greater_list(L,N,X).
greater_list([X|_], N, X) :- X > N.
空列表缺少子句意味着谓词对空列表失败

上面的第一个子句声明
X
是列表中大于
N
的项,如果它是子列表
L
中的此类项

第二个子句尝试回溯,声明如果
X
是列表的前元素且大于
N
,则谓词也是true

两个子句首先在子列表中进行Prolog搜索,并且只有在回溯时,考虑列表中存储的值。当回溯首先从更深的递归级别展开时,该规则将以先检查最后一个元素、然后第二个到最后一个等的方式应用。

[eclipse 2]: greater_list([1,9,2,8,3,7,12],7, X).

X = 12
Yes (0.00s cpu, solution 1, maybe more) ? ;

X = 8
Yes (0.00s cpu, solution 2, maybe more) ? ;

X = 9
Yes (0.00s cpu, solution 3, maybe more) ? ;

No (0.00s cpu)

所以基本上整个程序就是:
better(List,Limit,X):-reverse(List,L),member(X,L),X>限制。
我错误地理解了这些内置程序是如何工作的,我把这个简单的问题复杂化了。谢谢你的详细解释!!是的,应该是这样。我很高兴我能帮上忙!倾向于过分强调将内容放在列表中:翻译:在Prolog中,相当于从70年代就存在了。谢谢!我错误地理解了结果是有几十行代码。不幸的是,提问者不允许使用递归。
[eclipse 2]: greater_list([1,9,2,8,3,7,12],7, X).

X = 12
Yes (0.00s cpu, solution 1, maybe more) ? ;

X = 8
Yes (0.00s cpu, solution 2, maybe more) ? ;

X = 9
Yes (0.00s cpu, solution 3, maybe more) ? ;

No (0.00s cpu)