我到处都可以找到这段代码,用于复制列表或克隆列表。
随处可见的代码:
clone([],[]).
clone([H|T],[H|Z]):- clone(T,Z).
?-clone([1,2,3],Z).
Z=[1,2,3]
?-clone(2,Z).
false
除了
lists
以外,它不会复制其他任何内容。以上代码的时间复杂度为O(n)
。但是Prolog试图统一权利和提升面,对吗?这可以用更简单的方式编写,对吗?
像
clone1(Z,Z).
:clone1(Z,Z).
?-clone1([1,2,3],Z).
Z=[1,2,3]
?-clone1(1,Z).
Z=1
?-clone1(!,Z).
Z =!
?-clone1(@,Z).
Z=(@)
我觉得
clone1(X, X).
更为通用,几乎克隆了传递给它的所有内容。它没有克隆%
,(
,)
,()
。 clone1(%,Z)
失败,出现消息% - used for commenting
。clone1
的时间复杂度是O(1)
我可能是错误的。在各个方面,clone1
比clone
好得多。为什么此克隆/副本不是这样写的,即
clone(X, X).
我缺少了什么?请向我解释我上面提供的两个代码之间的区别。如果两者都相同,为什么不使用clone1(X, X).
,也没有人发表过。 最佳答案
调用clone1(Z,Z2)
与调用Z = Z2
相同。这更基本。
正如您自己指出的,区别在于clone/2
仅适用于列表,而=/2
适用于所有有效的Prolog术语。
该代码的另一点是要了解Prolog中的列表处理。它可以作为您可能要编写的其他递归列表处理任务的基础。如映射,过滤,计数等。
Sterling和Shapiro的书将此类代码称为某种数据类型的框架代码。
关于prolog - 克隆,复制序言列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59451939/