如何在Prolog中递归检索列表列表的元素?



假设你有一个列表,如下所示: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].

*/

最新更新