在 SWI-Prolog 中,如何将集合列表 [ 1, ( 2, 3 ) ] 转换、转换、变异、进化、更改为 [ 1, 2, 3 ]?
In SWI-Prolog, how to transform, convert, mutate, evolute, change a set list [ 1, ( 2, 3 ) ] to [ 1, 2, 3 ]?
我有一个程序可以使用 read/1 子句执行用户输入。然后创建一个包含输入信息的列表,如下所示:
write('Input' )
read(Folks),
consult('database.pl.pl'),
Predic =.. [Inform, [ Name, Bussi, Folks ] ],
assert(Predic),
在磁盘中写入:
Inform(['Juc', 'Rockstar', 'Desprogra', 1899, 1999, ( 'Bill', 'Steven', 'Demi' ) ]).
所以,我不能在列表末尾添加 ():
..., ( 'Bill', 'Steven', 'Demi' ) ]
我知道是因为:read(Folks),
必须阅读 'Bill', 'Steven', 'Demi'
。
Prolog 没有元组,因为我们可以将它们实现为逗号运算符的递归应用。对于一般处理,请阅读有关 analysing terms. In particular, (=..)/2 的部分,它通常用于执行结构的参数处理,但您在这里需要的可能是
conj_list((A,B), [A|Bs]) :- conj_list(B, Bs), !.
conj_list(T, [T]).
(剪切位置很重要,请实验看看它的作用)。现在,完成工作的更简单代码应该是
?- maplist(conj_list, [1,(2,3)],L), flatten(L, F).
L = [[1], [2, 3]],
F = [1, 2, 3].
设:
superflatten([],A,A).
superflatten([[]|Q],A,R) :- !,
superflatten(Q,A,R).
superflatten([H|Q],A,R) :-
H =.. [K|L],
( L = [] -> append(A,[K],T1); superflatten(L,A,T1) ),
superflatten(Q,T1,R).
superflatten(X,R) :- superflatten(X,[],R).
一些问题和答案的例子:
debug] ?- superflatten([],R).
R = [].
[debug] ?- superflatten([a,b],R).
R = [a, b].
[debug] ?- superflatten([a,[b,c]],R).
R = [a, b, c].
[debug] ?- superflatten([a,[],[b,c]],R).
R = [a, b, c].
[debug] ?- superflatten([a,(b,c)],R).
R = [a, b, c].
[debug] ?- superflatten([a,t(b,c)],R).
R = [a, b, c].
我有一个程序可以使用 read/1 子句执行用户输入。然后创建一个包含输入信息的列表,如下所示:
write('Input' )
read(Folks),
consult('database.pl.pl'),
Predic =.. [Inform, [ Name, Bussi, Folks ] ],
assert(Predic),
在磁盘中写入:
Inform(['Juc', 'Rockstar', 'Desprogra', 1899, 1999, ( 'Bill', 'Steven', 'Demi' ) ]).
所以,我不能在列表末尾添加 ():
..., ( 'Bill', 'Steven', 'Demi' ) ]
我知道是因为:read(Folks),
必须阅读 'Bill', 'Steven', 'Demi'
。
Prolog 没有元组,因为我们可以将它们实现为逗号运算符的递归应用。对于一般处理,请阅读有关 analysing terms. In particular, (=..)/2 的部分,它通常用于执行结构的参数处理,但您在这里需要的可能是
conj_list((A,B), [A|Bs]) :- conj_list(B, Bs), !.
conj_list(T, [T]).
(剪切位置很重要,请实验看看它的作用)。现在,完成工作的更简单代码应该是
?- maplist(conj_list, [1,(2,3)],L), flatten(L, F).
L = [[1], [2, 3]],
F = [1, 2, 3].
设:
superflatten([],A,A).
superflatten([[]|Q],A,R) :- !,
superflatten(Q,A,R).
superflatten([H|Q],A,R) :-
H =.. [K|L],
( L = [] -> append(A,[K],T1); superflatten(L,A,T1) ),
superflatten(Q,T1,R).
superflatten(X,R) :- superflatten(X,[],R).
一些问题和答案的例子:
debug] ?- superflatten([],R).
R = [].
[debug] ?- superflatten([a,b],R).
R = [a, b].
[debug] ?- superflatten([a,[b,c]],R).
R = [a, b, c].
[debug] ?- superflatten([a,[],[b,c]],R).
R = [a, b, c].
[debug] ?- superflatten([a,(b,c)],R).
R = [a, b, c].
[debug] ?- superflatten([a,t(b,c)],R).
R = [a, b, c].