在prolog中通过列表进行迭代,无需递归
我想用prolog写一个列表。但问题是我不想使用递归。在prolog中通过列表进行迭代,无需递归,prolog,iteration,Prolog,Iteration,我想用prolog写一个列表。但问题是我不想使用递归。 因此,我想以迭代的方式对此进行讨论。严格来说,当您想要表达列表中所有(或足够多)元素的某种关系时,您无法避免递归。但是,您可以将递归部分委托给某个库谓词 以中国为例。比如说maplist(=(ux),Xs),它描述了所有元素相同的列表。对你来说,不再有任何递归。但背后有一个递归定义: maplist(_C_1, []). maplist(C_1, [E|Es]) :- call(C_1, E), maplist(C_1, Es)
因此,我想以迭代的方式对此进行讨论。严格来说,当您想要表达列表中所有(或足够多)元素的某种关系时,您无法避免递归。但是,您可以将递归部分委托给某个库谓词 以中国为例。比如说
maplist(=(ux),Xs)
,它描述了所有元素相同的列表。对你来说,不再有任何递归。但背后有一个递归定义:
maplist(_C_1, []).
maplist(C_1, [E|Es]) :-
call(C_1, E),
maplist(C_1, Es).
还有其他方法可以实现递归谓词的快捷方式,如do循环和。但最终,它们都转换为某种递归定义(或称为递归谓词)
实际上没有理由担心在Prolog中使用递归。毕竟,系统经过了相当优化,可以有效地处理递归。在命令式编程语言中,递归谓词通常“像”简单循环一样运行。另外,内存分配非常适合于清理中间/易失性数据。使用Swi Prolog,我一直在试验findall/3将其最后一个列表参数aka统一起来的事实。它可以“反向运行”或输入/输出交换,类似于findall(,[a,b,c]) 然后我想到了这个:
Li=[a,b,c,d,e,f,g,h],findall(A, (append(A,B,Li),B=[C|_],writeln(C)), _).
A和B被实例化为子列表
即使这样也行
Li=[a,b,c,d,e,f,g,h],findall(_, (append(_,B,Li),B=[C|_],writeln(C)), _).
我不知道代码的效率有多高,很可能效率不高。您应该首先学习Prolog的递归规则:)如果编写所有列表意味着编写以输出列表中的所有元素,那么可以使用
forall/2
:forall(member(X,L),write(X).
@TudorBerariu:member/2
是递归定义的。正如你所说,你不能避免递归。我假设他想避免编写显式递归谓词。当然你是对的,member/2
使用递归。你为什么不想使用递归?