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

时间:2019-11-26 14:03:40

标签: prolog

  
    

假定您有一个列表,例如:L = [1,2,[4,5,[6],[7,8,9]],[1,2]]。

         

问:如何使用基本谓词得出X = [1,2,4,5,6,7,8,9,1,2]?

  

列表的深度可以是任意的,这似乎很困难。

1 个答案:

答案 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].

* /