Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在prolog中通过列表进行迭代,无需递归_Prolog_Iteration - Fatal编程技术网

在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)

我想用prolog写一个列表。但问题是我不想使用递归。
因此,我想以迭代的方式对此进行讨论。

严格来说,当您想要表达列表中所有(或足够多)元素的某种关系时,您无法避免递归。但是,您可以将递归部分委托给某个库谓词

以中国为例。比如说
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
使用递归。你为什么不想使用递归?