我到处都可以找到这段代码,用于复制列表或克隆列表。

随处可见的代码:

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 commentingclone1的时间复杂度是O(1)我可能是错误的。在各个方面,clone1clone好得多。

为什么此克隆/副本不是这样写的,即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/

10-13 05:18