Я нашел этот фрагмент кода везде для копирования списка или его клонирования.
Код, найденный везде:
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)
.
Но Пролог пытается объединить право и поднять сторону, верно? Это можно записать гораздо проще, верно?
Как и 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).
не используется, и никто не написал об этом.