Joh*_*ohn 3 tuples list prolog
List1=[(x,1),(y,1),(z,1)]
Run Code Online (Sandbox Code Playgroud)
我正在尝试拆分此列表:
分为两个列表:
List3=[x,y,z]
List4=[1,1,1]
Run Code Online (Sandbox Code Playgroud)
所以我写了这个谓词来尝试这样做:
splt([], [], []).
splt([X|Xs], [Y|Ys], [X,Y|Zs]) :-
splt(Xs,Ys,Zs).
Run Code Online (Sandbox Code Playgroud)
但是,谓词不是所需的结果,而是返回:
1 ?- splt([(x,1),(y,2),(z,3)],L3,L4).
L3 = [_G1760, _G1769, _G1778],
L4 = [ (z, 1), _G1760, (y, 2), _G1769, (z, 3), _G1778].
Run Code Online (Sandbox Code Playgroud)
小智 7
首先,你选择的术语.这:(a, b),是绝对不是你会怎么通常在Prolog中表示一个"元组".您几乎总是使用a-b"对",并且在整个标准库中使用对.
所以你的初始列表看起来像这样:[x-1, y-1, z-1].
这也应该解释为什么你遇到了问题.你写了(a, b),但你的谓词说a, b,当你期望获得一个,(a,b)学期时,你会消耗两个元素.所以,要修复当前谓词,你会写:
split([], [], []).
split([X|Xs], [Y|Ys], [(X,Y)|XYs]) :-
split(Xs, Ys, XYs).
?- split(Xs, Ys, [(x,1), (y,1), (z,1)]).
Xs = [x, y, z],
Ys = [1, 1, 1].
Run Code Online (Sandbox Code Playgroud)
但相反,使用更传统的名称,术语顺序和Prolog对:
zip([], [], []).
zip([X-Y|XYs], [X|Xs], [Y|Ys]) :-
zip(XYs, Xs, Ys).
?- zip([x-1, y-1, z-1], Xs, Ys).
Xs = [x, y, z],
Ys = [1, 1, 1].
Run Code Online (Sandbox Code Playgroud)
当然,SWI-Prolog至少有一个库(对),它附带一个pairs_keys_values/3:
?- pairs_keys_values([x-1, y-1, z-1], Xs, Ys).
Xs = [x, y, z],
Ys = [1, 1, 1].
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
262 次 |
| 最近记录: |