相关疑难解决方法(0)

了解差异列表

我正在尝试理解Prolog中的差异列表,但我正在努力实际实现一个,每次我尝试这样做,我得到一个列表列表,但这不是我想要的.我正在尝试实现一个追加谓词,但到目前为止运气不佳.很少有尝试,所有这些都无效.

app(X, Y, Z) :- Z = [X|Y].

?- app([a,b,c], [z], Z).
Z = [[a,b,c],z].
Run Code Online (Sandbox Code Playgroud)

要么

app(X, Y, Z) :- Z = [X|Hole], Hole = Y.
Run Code Online (Sandbox Code Playgroud)

与第一个结果相同(它们看起来基本相同).我在一本有效的书中有一个例子(尽管它不是谓词),我不明白其中的区别.X实例化到正确答案[a,b,c,z],与第二个例子有什么不同?

X = [a,b,c|Y], Y = [z].
Run Code Online (Sandbox Code Playgroud)

我错过了什么?谢谢.

prolog difference-lists

14
推荐指数
2
解决办法
5794
查看次数

Prolog和可变变量中的差异列表

差异列表是否可以“解决”变量在序言中不可变的事实?

即如果我实现使用差异列表追加:

diff_append(OpenList, Hole, L2) :-
    Hole = L2.
Run Code Online (Sandbox Code Playgroud)

然后运行:

X=[a,b,c|Hole], diff_append(X, Hole, [d,e,f]).
Run Code Online (Sandbox Code Playgroud)

在某种程度上,X已用作可变变量。就我们的意图和目的而言,它已经改变了吗?

换句话说,我们能够修改X(可变),而不必构造新列表(例如Z(不可变)),这使得差异列表具有吸引力。那么为什么不仅仅拥有可变变量呢?

更新:

diff_append2(OpenList-Hole,L2):-
    Hole=L2.

X=[a,b,c|Ho]-Ho,diff_append2(X,[d,e,f]).
Run Code Online (Sandbox Code Playgroud)

queue prolog difference-lists

4
推荐指数
1
解决办法
994
查看次数

如何在Prolog解释器中使用差异列表

当我把这个问题在一个空列表上作为差异列表时,我想测试我对这些结构的了解.然而,当我尝试一些简单的事情,比如比较不同的符号时,似乎我错了,而且我明白差异列表实际发生了什么.

?- L = [a,b,c|[d,e]]-[d,e], L = [a,b,c].
false % expected true
Run Code Online (Sandbox Code Playgroud)

我在SWI-Prolog和SICStus上测试了这个.我验证了符号,因为它是如何在Bratko的人工智能Prolog编程中编写的,第210页,但显然统一是不可能的.这是为什么?这些符号不具有相同的声明含义吗?

prolog difference-lists

1
推荐指数
1
解决办法
350
查看次数

标签 统计

difference-lists ×3

prolog ×3

queue ×1