prolog - 克隆、复制序言列表

标签 prolog copy clone

我发现这段代码随处可见,用于复制列表或克隆列表。

代码随处可见:

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 试图统一 right 和 lift side,对吧?这可以写得更简单,对吗?

喜欢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 .时间复杂度为clone1O(1)我可能错了。各个方面,clone1clone 好得多.

为什么这个克隆/副本不这样写,即 clone(X, X).我缺少什么?请向我解释一下我上面提供的两个代码之间的区别。如果两者都做同样的事情,为什么是 clone1(X, X).没有使用过,也没有人发布过相关信息。

最佳答案

需要记住的一件事是“克隆”或“复制”的确切含义。变量会发生什么?

例如,如果您使用统一进行克隆,则:

| ?- L1 = [1,2,X], L2 = L1.

L1 = [1,2,X]
L2 = [1,2,X]

yes
| ?- L1 = [1,2,X], L2 = L1, X = a.

L1 = [1,2,a]
L2 = [1,2,a]
X = a

yes
| ?-

换句话说,通过统一,任何以这种方式“复制”或“克隆”的相应变量都保持统一(因为术语是统一的)。

如果您在“克隆”或“复制”时想要新变量,则需要使用 Prolog 的 copy_term/2:

| ?-  L1 = [1,2,X], copy_term(L1, L2), X = a.

L1 = [1,2,a]
L2 = [1,2,_]
X = a

yes
| ?-

所以现在 L2L1 的副本,它自己的变量位于列表中的第三个位置。

关于prolog - 克隆、复制序言列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59451939/

相关文章:

sql - 如何使 Postgres Copy 忽略大 txt 文件的第一行

java - 克隆内部类定义的对象

rust - 派生特征会导致意外的编译器错误,但手动实现有效

jquery - 使用 jQuery 在当前行之后添加新表行

multithreading - 非确定性编程语言

prolog - 适用于大数的 positive_integer/1 谓词

Javascript - 跟随链接,复制 URL 并更改原件?

vb.net - 如何将整列从一个数据 GridView 复制到另一个数据 GridView ?

prolog - 查找 prolog 程序给出错误结果的查询

prolog - Prolog 如何将 DCG 规则翻译成定句?