假设你有一个列表,如下所示:L = [1,2, [4,5, [6], [7,8,9]], [1,2]]。
问:如何使用基本谓词来生成 X = [1,2,4,5,6,7,8,9,1,2]?
当列表的深度可以任意时,这似乎很困难。
/* 当你说"当列表的深度可以任意时,这似乎很困难" 这不是真的.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].
*/