假定您有一个列表,例如:L = [1,2,[4,5,[6],[7,8,9]],[1,2]]。
问:如何使用基本谓词得出X = [1,2,4,5,6,7,8,9,1,2]?
列表的深度可以是任意的,这似乎很困难。
答案 0 :(得分:1)
/ * 当您说“列表的深度可以任意时,似乎很难” .vus.a.vis是不正确的。序言。
大量使用Prolog编程 如果递归函数调用 并可以轻松地递归 充分探索任何树状 数据结构 。 * /
:- [library(plunit)] .
:- abolish(flatten/2) .
:- mode(flatten(+,-)) .
flatten(0,_) --> [Q] , flatten(1,Q) .
flatten(1,Q) --> \+ {is_list(Q)} , flatten(2,Q) .
flatten(1,Q) --> \+ \+ {is_list(Q)} , flatten(3,Q) .
flatten(2,Q) , [Q] --> flatten(0,_) .
flatten(3,Q) --> {Q=[]} , flatten(0,_) .
flatten(3,Q) --> {Q=[R|Ts]} , flatten(1,R) , flatten(1,Ts) .
:- begin_tests(flatten) .
test('1',[true(Ps=[4,5,6,7,8,9,1,2])]) :-
flatten([4,5,[6],[7,8,9],[1,2]],Ps) .
test('2',[true(Ps=[1,2,3,4])]) :-
flatten([1,[2,3],[],4],Ps) .
test('3',[true(Ps=Qs)]) :-
flatten(Qs,Ps) .
:- end_tests(flatten) .
/ * 样品运行。
?- run_tests .
% PL-Unit: flatten ... done % All 3 tests passed
?- flatten([1,[2,3],[],4],Ps).
Ps = [1,2,3,4].
?- flatten([4,5,[6],[7,8,9],[1,2]],Ps) .
Ps = [4,5,6,7,8,9,1,2].
?- flatten(Qs,Ps) .
Ps = [Qs].
* /