web-dev-qa-db-ja.com

複数のリストの組み合わせ-プロローグ

リストのリストから組み合わせを見つける必要があります。たとえば、次のリストを与えます、

List = [[1, 2], [1, 2, 3]]

これらは出力でなければなりません、

Comb = [[1,1],[1,2],[1,3],[2,1],[2,2],[2,3]]

もう一つの例:

List = [[1,2],[1,2],[1,2,3]]

Comb = [[1,1,1],[1,1,2],[1,1,3],[1,2,1],[1,2,2],[1,2,3]....etc]

2つのサブリストを持つリストでそれを行う方法を知っていますが、任意の数のサブリストで機能する必要があります。

私はプロローグを初めて使います。助けてください。

4
Liuda Donic

@falseのアプローチのひねり:

%list_comb(++L,-Ess)
list_comb( L, Ess):-
    is_list( L),
    maplist( is_list, L),
    findall( Es, maplist( member, Es, L), Ess).

テスト:

41 ?- list_comb([[1,2],[1],[1]], X).
X = [[1, 1, 1], [2, 1, 1]].

42 ?- list_comb([[1,2],[1],[1,2,3]], X).
X = [[1, 1, 1], [1, 1, 2], [1, 1, 3], [2, 1, 1], [2, 1, 2], [2, 1, 3]].

43 ?- list_comb([[1,2],[],[1,2,3]], X).
X = [].

44 ?- list_comb([[1,2],t,[1,2,3]], X).
false.

45 ?- list_comb(t, X).
false.
0
Will Ness

既存の入力を完全に消去する必要があります。履歴を使用して、戻って削除されたものを確認できます。最後の部分を追加すると、30,000文字の制限をはるかに超えて、最初からやり直すことにしました。

これは メカニカルカウンター のように行われる答えです

_base_extend(R,[],[R]) :- !.
base_extend([],[Extender|Extenders],[H|T]) :-
    must_be(single_level_list,[Extender|Extenders]),
    H = [Extender],
    base_extend_part_2([],Extenders,H,T), !.
base_extend(Base,[Extender|Extenders],[H|T]) :-
    must_be(single_level_list,Base),
    is_list(Base),
    must_be(single_level_list,[Extender|Extenders]),
    append(Base,[Extender],H),
    base_extend_part_2(Base,Extenders,H,T), !.
base_extend(Base,[Extender|Extenders],[H|T]) :-
    must_be(single_level_list,Base),
    \+ is_list(Base),
    must_be(single_level_list,[Extender|Extenders]),
    append([Base],[Extender],H),
    base_extend_part_2(Base,Extenders,H,T).

base_extend_part_2(_,[],H,[]) :-
    must_be(single_level_list,H),!.
base_extend_part_2(Base,Extenders,H,T) :-
    base_extend(Base,Extenders,T),
    must_be(double_level_list,[H|T]), !.

bases_extend([],_,[]) :- !.
bases_extend([Base|Bases],Extenders,R) :-
    must_be(double_level_list,[Base|Bases]),
    must_be(single_level_list,Extenders),
    base_extend(Base,Extenders,R0),
    bases_extend(Bases,Extenders,R1),
    append(R0,R1,R),
    must_be(double_level_list,R).

combinations_via_extending([],[[]]) :- !.
combinations_via_extending([L1],R) :-
    base_extend([],L1,R).
combinations_via_extending([L1,L2],R) :-
    bases_extend(L1,L2,R).
combinations_via_extending([L1,L2|T],R) :-
    bases_extend(L1,L2,R0),
    combinations_via_extending([R0|T],R).
combinations_via_extending(Sets,_) :-
    format(', Unmatched Rule @4: ~w',[Sets]).

combinations_via_extending_primer([],[[]]) :- !.
combinations_via_extending_primer([H],R) :-
    base_extend([],H,R), !.
combinations_via_extending_primer([H|T],R) :-
    base_extend([],H,R0),
    combinations_via_extending([R0|T],R), !.

_

ここにテストケースがあります

_:- begin_tests(example_07).

example_07_test_case_generator( 01, [                              ] ,[ []                               ] ).
example_07_test_case_generator( 02, [ [a]                          ] ,[ [a]                              ] ).
example_07_test_case_generator( 03, [ [a,b]                        ] ,[ [a]       ,[b]                   ] ).
example_07_test_case_generator( 04, [ [a]       ,[b]               ] ,[ [a,b]                            ] ).
example_07_test_case_generator( 05, [ [a,b,c]                      ] ,[ [a]       ,[b]     ,[c]          ] ).
example_07_test_case_generator( 06, [ [a,b]     ,[c]               ] ,[ [a,c]     ,[b,c]                 ] ).
example_07_test_case_generator( 07, [ [a]       ,[b,c]             ] ,[ [a,b]     ,[a,c]                 ] ).
example_07_test_case_generator( 08, [ [a]       ,[b]   ,[c]        ] ,[ [a,b,c]                          ] ).
example_07_test_case_generator( 09, [ [a,b,c,d]                    ] ,[ [a]       ,[b]     ,[c]   ,[d]   ] ).
example_07_test_case_generator( 10, [ [a,b,c]   ,[d]               ] ,[ [a,d]     ,[b,d]   ,[c,d]        ] ).
example_07_test_case_generator( 11, [ [a,b]     ,[c,d]             ] ,[ [a,c]     ,[a,d]   ,[b,c] ,[b,d] ] ).
example_07_test_case_generator( 12, [ [a,b]     ,[c]   ,[d]        ] ,[ [a,c,d]   ,[b,c,d]               ] ).
example_07_test_case_generator( 13, [ [a]       ,[b,c] ,[d]        ] ,[ [a,b,d]   ,[a,c,d]               ] ).
example_07_test_case_generator( 14, [ [a]       ,[b]   ,[c,d]      ] ,[ [a,b,c]   ,[a,b,d]               ] ).
example_07_test_case_generator( 15, [ [a]       ,[b]   ,[c]   ,[d] ] ,[ [a,b,c,d]                        ] ).

test(1,[condition(true),forall(example_07_test_case_generator(_Test_number,Sets,Expected_result))]) :-
    bagof(Es, maplist(member,Es,Sets), Expected_result).

test(2,[condition(true),forall(example_07_test_case_generator(_Test_number,Sets,Expected_result))]) :-
    combinations_via_extending_primer(Sets,Expected_result).

:- end_tests(example_07).
_

テストを実行します。

_?- run_tests(example_07).
% PL-Unit: example_07 .............................. done
% All 30 tests passed
true.
_

以下は、テストケースに空のセットを含むより完全な例です。

_remove_empty([],[]) :-
    !.
remove_empty([H|T],R) :-
    must_be(double_level_list,[H|T]),
    H = [],
    remove_empty(T,R),
    must_be(list,R),    % Can be single or double level list
    !.
remove_empty([H|T],[H|R]) :-
    must_be(double_level_list,[H|T]),
    H \= [],
    remove_empty(T,R),
    must_be(list,R).    % Can be single or double level list
_
_:- begin_tests(example_06).

example_06_test_case_generator( 01, [                                             ] ,[ []                             ] ).
example_06_test_case_generator( 02, [ []                                          ] ,[ []                             ] ).
example_06_test_case_generator( 03, [ []       ,[]                                ] ,[ []                             ] ).
example_06_test_case_generator( 04, [ []       ,[]        ,[]                     ] ,[ []                             ] ).
example_06_test_case_generator( 05, [ []       ,[]        ,[]          ,[]        ] ,[ []                             ] ).
example_06_test_case_generator( 06, [ [a]                                         ] ,[ [a]                            ] ).
example_06_test_case_generator( 07, [ [a]      ,[]                                ] ,[ [a]                            ] ).
example_06_test_case_generator( 08, [ []       ,[a]                               ] ,[ [a]                            ] ).
example_06_test_case_generator( 09, [ [a]      ,[]        ,[]                     ] ,[ [a]                            ] ).
example_06_test_case_generator( 10, [ []       ,[a]       ,[]                     ] ,[ [a]                            ] ).
example_06_test_case_generator( 11, [ []       ,[]        ,[a]                    ] ,[ [a]                            ] ).
example_06_test_case_generator( 12, [ [a]      ,[]        ,[]          ,[]        ] ,[ [a]                            ] ).
example_06_test_case_generator( 13, [ []       ,[a]       ,[]          ,[]        ] ,[ [a]                            ] ).
example_06_test_case_generator( 14, [ []       ,[]        ,[a]         ,[]        ] ,[ [a]                            ] ).
example_06_test_case_generator( 15, [ []       ,[]        ,[]          ,[a]       ] ,[ [a]                            ] ).
example_06_test_case_generator( 16, [ [a,b]                                       ] ,[ [a]      ,[b]                  ] ).
example_06_test_case_generator( 17, [ [a,b]    ,[]                                ] ,[ [a]      ,[b]                  ] ).
example_06_test_case_generator( 18, [ [a]      ,[b]                               ] ,[ [a,b]                          ] ).
example_06_test_case_generator( 19, [ []       ,[a,b]                             ] ,[ [a]      ,[b]                  ] ).
example_06_test_case_generator( 20, [ [a]      ,[b]       ,[]                     ] ,[ [a,b]                          ] ).
example_06_test_case_generator( 21, [ [a]      ,[]        ,[b]                    ] ,[ [a,b]                          ] ).
example_06_test_case_generator( 22, [ []       ,[a]       ,[b]                    ] ,[ [a,b]                          ] ).
example_06_test_case_generator( 23, [ [a,b]    ,[]        ,[]                     ] ,[ [a]      ,[b]                  ] ).
example_06_test_case_generator( 24, [ []       ,[a,b]     ,[]                     ] ,[ [a]      ,[b]                  ] ).
example_06_test_case_generator( 25, [ []       ,[]        ,[a,b]                  ] ,[ [a]      ,[b]                  ] ).
example_06_test_case_generator( 26, [ [a]      ,[b]       ,[]          ,[]        ] ,[ [a,b]                          ] ).
example_06_test_case_generator( 27, [ [a]      ,[]        ,[b]         ,[]        ] ,[ [a,b]                          ] ).
example_06_test_case_generator( 28, [ [a]      ,[]        ,[]          ,[b]       ] ,[ [a,b]                          ] ).
example_06_test_case_generator( 29, [ []       ,[a]       ,[b]         ,[]        ] ,[ [a,b]                          ] ).
example_06_test_case_generator( 30, [ []       ,[a]       ,[]          ,[b]       ] ,[ [a,b]                          ] ).
example_06_test_case_generator( 31, [ []       ,[]        ,[a]         ,[b]       ] ,[ [a,b]                          ] ).
example_06_test_case_generator( 32, [ [a,b]    ,[]        ,[]          ,[]        ] ,[ [a]      ,[b]                  ] ).
example_06_test_case_generator( 33, [ []       ,[a,b]     ,[]          ,[]        ] ,[ [a]      ,[b]                  ] ).
example_06_test_case_generator( 34, [ []       ,[]        ,[]          ,[a,b]     ] ,[ [a]      ,[b]                  ] ).
example_06_test_case_generator( 35, [ [a,b,c]                                     ] ,[ [a]      ,[b]   ,[c]           ] ).
example_06_test_case_generator( 36, [ [a,b,c]  ,[]                                ] ,[ [a]      ,[b]   ,[c]           ] ).
example_06_test_case_generator( 37, [ [a,b]    ,[c]                               ] ,[ [a,c]    ,[b,c]                ] ).
example_06_test_case_generator( 38, [ [a]      ,[b,c]                             ] ,[ [a,b]    ,[a,c]                ] ).
example_06_test_case_generator( 39, [ []       ,[a,b,c]                           ] ,[ [a]      ,[b]   ,[c]           ] ).
example_06_test_case_generator( 40, [ [a]      ,[b,c]     ,[]                     ] ,[ [a,b]    ,[a,c]                ] ).
example_06_test_case_generator( 41, [ [a]      ,[]        ,[b,c]                  ] ,[ [a,b]    ,[a,c]                ] ).
example_06_test_case_generator( 42, [ [a]      ,[b]       ,[c]                    ] ,[ [a,b,c]                        ] ).
example_06_test_case_generator( 43, [ [a,b]    ,[c]       ,[]                     ] ,[ [a,c]    ,[b,c]                ] ).
example_06_test_case_generator( 44, [ [a,b]    ,[]        ,[c]                    ] ,[ [a,c]    ,[b,c]                ] ).
example_06_test_case_generator( 45, [ [a,b,c]  ,[]        ,[]                     ] ,[ [a]      ,[b]   ,[c]           ] ).
example_06_test_case_generator( 46, [ []       ,[a]       ,[b,c]                  ] ,[ [a,b]    ,[a,c]                ] ).
example_06_test_case_generator( 47, [ []       ,[a,b]     ,[c]                    ] ,[ [a,c]    ,[b,c]                ] ).
example_06_test_case_generator( 48, [ []       ,[a,b,c]   ,[]                     ] ,[ [a]      ,[b]   ,[c]           ] ).
example_06_test_case_generator( 49, [ []       ,[]        ,[a,b,c]                ] ,[ [a]      ,[b]   ,[c]           ] ).
example_06_test_case_generator( 50, [ [a]      ,[b,c]     ,[]          ,[]        ] ,[ [a,b]    ,[a,c]                ] ).
example_06_test_case_generator( 51, [ [a]      ,[b]       ,[c]         ,[]        ] ,[ [a,b,c]                        ] ).
example_06_test_case_generator( 52, [ [a]      ,[b]       ,[]          ,[c]       ] ,[ [a,b,c]                        ] ).
example_06_test_case_generator( 53, [ [a]      ,[]        ,[b,c]       ,[]        ] ,[ [a,b]    ,[a,c]                ] ).
example_06_test_case_generator( 54, [ [a]      ,[]        ,[b]         ,[c]       ] ,[ [a,b,c]                        ] ).
example_06_test_case_generator( 55, [ [a]      ,[]        ,[]          ,[b,c]     ] ,[ [a,b]    ,[a,c]                ] ).
example_06_test_case_generator( 56, [ [a,b]    ,[c]       ,[]          ,[]        ] ,[ [a,c]    ,[b,c]                ] ).
example_06_test_case_generator( 57, [ [a,b]    ,[]        ,[c]         ,[]        ] ,[ [a,c]    ,[b,c]                ] ).
example_06_test_case_generator( 58, [ [a,b]    ,[]        ,[]          ,[c]       ] ,[ [a,c]    ,[b,c]                ] ).
example_06_test_case_generator( 59, [ [a,b,c]  ,[]        ,[]          ,[]        ] ,[ [a]      ,[b]   ,[c]           ] ).
example_06_test_case_generator( 60, [ []       ,[a]       ,[b,c]       ,[]        ] ,[ [a,b]    ,[a,c]                ] ).
example_06_test_case_generator( 61, [ []       ,[a]       ,[b]         ,[c]       ] ,[ [a,b,c]                        ] ).
example_06_test_case_generator( 62, [ []       ,[a]       ,[]          ,[b,c]     ] ,[ [a,b]    ,[a,c]                ] ).
example_06_test_case_generator( 63, [ []       ,[a,b]     ,[c]         ,[]        ] ,[ [a,c]    ,[b,c]                ] ).
example_06_test_case_generator( 64, [ []       ,[a,b]     ,[]          ,[c]       ] ,[ [a,c]    ,[b,c]                ] ).
example_06_test_case_generator( 65, [ []       ,[a,b,c]   ,[]          ,[]        ] ,[ [a]      ,[b]   ,[c]           ] ).
example_06_test_case_generator( 66, [ []       ,[]        ,[a]         ,[b,c]     ] ,[ [a,b]    ,[a,c]                ] ).
example_06_test_case_generator( 67, [ []       ,[]        ,[a,b]       ,[c]       ] ,[ [a,c]    ,[b,c]                ] ).
example_06_test_case_generator( 68, [ []       ,[]        ,[a,b,c]     ,[]        ] ,[ [a]      ,[b]   ,[c]           ] ).
example_06_test_case_generator( 69, [ []       ,[]        ,[]          ,[a,b,c]   ] ,[ [a]      ,[b]   ,[c]           ] ).

test(1,[condition(true),forall(example_06_test_case_generator(_Test_number,Sets0,Expected_result))]) :-
    remove_empty(Sets0,Sets),
    bagof(Es, maplist(member,Es,Sets),Expected_result).

test(2,[condition(true),forall(example_06_test_case_generator(_Test_number,Sets0,Expected_result))]) :-
    remove_empty(Sets0,Sets),
    combinations_via_extending_primer(Sets,Expected_result).

:- end_tests(example_06).
_

テストを実行します。

_?- run_tests(example_06).
% PL-Unit: example_06 .......................................................................................................................................... done
% All 138 tests passed
true
_

リストを型チェックするためのコードは次のとおりです。

_:- multifile
    error:has_type/2.

error:has_type(single_level_list,List) :-
    is_one_level_closed_list(List).

error:has_type(double_level_list,List) :-
    is_two_level_closed_list(List).

is_one_level_closed_list(List) :-
    nonvar(List),
    (
        List == []
    ->
        true
    ;
        List = [H|T],
        (
            is_list(H)
        ->
            fail
        ;
            (
                T == []
            ->
                true
            ;
                is_one_level_closed_list(T)
            )
        )
    ).
_
_is_two_level_closed_list(List) :-
    nonvar(List),
    (
        List == [[]]
    ->
        true
    ;
        List = [H|T],
        (
            is_one_level_closed_list(H)
        ->
            (
                T == []
            ->
                true
            ;
                is_two_level_closed_list(T)
            )
        ;
            fail
        )
    ).
_

ここにテストケースがあります。

_
:- begin_tests(is_one_level_closed_list).

is_one_level_closed_list_test_case_generator( 01, []          ,true  ).
is_one_level_closed_list_test_case_generator( 02, [a]         ,true  ).
is_one_level_closed_list_test_case_generator( 03, [a,b]       ,true  ).
is_one_level_closed_list_test_case_generator( 04, [a,b,c]     ,true  ).
is_one_level_closed_list_test_case_generator( 05, [a,_]       ,true  ).
is_one_level_closed_list_test_case_generator( 06, [_,a]       ,true  ).
is_one_level_closed_list_test_case_generator( 07, [_,_]       ,true  ).
is_one_level_closed_list_test_case_generator( 08, [a|[]]      ,true  ).
is_one_level_closed_list_test_case_generator( 09, [a,b|[]]    ,true  ).
is_one_level_closed_list_test_case_generator( 10, [a,b,c|[]]  ,true  ).
is_one_level_closed_list_test_case_generator( 11, [_|[]]      ,true  ).
is_one_level_closed_list_test_case_generator( 12, [_,_|[]]    ,true  ).
is_one_level_closed_list_test_case_generator( 13, [_,_,_|[]]  ,true  ).
is_one_level_closed_list_test_case_generator( 14, a           ,false ).
is_one_level_closed_list_test_case_generator( 15, 1           ,false ).
is_one_level_closed_list_test_case_generator( 16, _           ,false ).
is_one_level_closed_list_test_case_generator( 17, [a|_]       ,false ).
is_one_level_closed_list_test_case_generator( 18, [_|a]       ,false ).
is_one_level_closed_list_test_case_generator( 19, [_|_]       ,false ).
is_one_level_closed_list_test_case_generator( 20, [[]|_]      ,false ).
is_one_level_closed_list_test_case_generator( 21, [[]|[]]     ,false ).
is_one_level_closed_list_test_case_generator( 22, [[]|a]      ,false ).
is_one_level_closed_list_test_case_generator( 23, [a|b]       ,false ).
is_one_level_closed_list_test_case_generator( 24, [[]]        ,false ).
is_one_level_closed_list_test_case_generator( 25, [a,[]]      ,false ).
is_one_level_closed_list_test_case_generator( 26, [[],a]      ,false ).
is_one_level_closed_list_test_case_generator( 27, [[],[]]     ,false ).
is_one_level_closed_list_test_case_generator( 28, [[],a,b]    ,false ).
is_one_level_closed_list_test_case_generator( 29, [a,[],b]    ,false ).
is_one_level_closed_list_test_case_generator( 30, [a,b,[]]    ,false ).
is_one_level_closed_list_test_case_generator( 31, [[],[],a,b] ,false ).
is_one_level_closed_list_test_case_generator( 32, [[],a,[],b] ,false ).
is_one_level_closed_list_test_case_generator( 33, [[],a,b,[]] ,false ).
is_one_level_closed_list_test_case_generator( 34, [a,[],[],b] ,false ).
is_one_level_closed_list_test_case_generator( 35, [a,[],b,[]] ,false ).
is_one_level_closed_list_test_case_generator( 36, [a,b,[],[]] ,false ).
is_one_level_closed_list_test_case_generator( 37, [[],a,b,c]  ,false ).
is_one_level_closed_list_test_case_generator( 38, [a,[],b,c]  ,false ).
is_one_level_closed_list_test_case_generator( 39, [a,b,[],c]  ,false ).
is_one_level_closed_list_test_case_generator( 40, [a,b,c,[]]  ,false ).

test(1,[forall(is_one_level_closed_list_test_case_generator(_Test_number,List,Result))]) :-
    (
        is_one_level_closed_list(List)
    ->
        Result = true
    ;
        Result = false
    ).

:- end_tests(is_one_level_closed_list).



:- begin_tests(is_two_level_closed_list).

is_two_level_closed_list_test_case_generator( 01, [[_]]         ,true  ).
is_two_level_closed_list_test_case_generator( 02, [[a]]         ,true  ).
is_two_level_closed_list_test_case_generator( 03, [[]]          ,true  ).
is_two_level_closed_list_test_case_generator( 04, [[_]|[]]      ,true  ).
is_two_level_closed_list_test_case_generator( 05, [[a]|[]]      ,true  ).
is_two_level_closed_list_test_case_generator( 06, [[]|[]]       ,true  ).
is_two_level_closed_list_test_case_generator( 07, [[_],[_]]     ,true  ).
is_two_level_closed_list_test_case_generator( 08, [[a],[_]]     ,true  ).
is_two_level_closed_list_test_case_generator( 09, [[_],[a]]     ,true  ).
is_two_level_closed_list_test_case_generator( 10, [[],[]]       ,true  ).
is_two_level_closed_list_test_case_generator( 11, [[a],[]]      ,true  ).
is_two_level_closed_list_test_case_generator( 12, [[],[a]]      ,true  ).
is_two_level_closed_list_test_case_generator( 13, [[_],[_]]     ,true  ).
is_two_level_closed_list_test_case_generator( 14, [[],[_]]      ,true  ).
is_two_level_closed_list_test_case_generator( 15, [[_],[]]      ,true  ).
is_two_level_closed_list_test_case_generator( 16, [[_],[_]|[]]  ,true  ).
is_two_level_closed_list_test_case_generator( 17, [[a],[_]|[]]  ,true  ).
is_two_level_closed_list_test_case_generator( 18, [[_],[a]|[]]  ,true  ).
is_two_level_closed_list_test_case_generator( 19, [[],[]|[]]    ,true  ).
is_two_level_closed_list_test_case_generator( 20, [[a],[]|[]]   ,true  ).
is_two_level_closed_list_test_case_generator( 21, [[],[a]|[]]   ,true  ).
is_two_level_closed_list_test_case_generator( 22, [[_],[_]|[]]  ,true  ).
is_two_level_closed_list_test_case_generator( 23, [[],[_]|[]]   ,true  ).
is_two_level_closed_list_test_case_generator( 24, [[_],[]|[]]   ,true  ).
is_two_level_closed_list_test_case_generator( 25, []            ,false ).
is_two_level_closed_list_test_case_generator( 26, [a]           ,false ).
is_two_level_closed_list_test_case_generator( 27, [a,b]         ,false ).
is_two_level_closed_list_test_case_generator( 28, [a,b,c]       ,false ).
is_two_level_closed_list_test_case_generator( 29, [a,_]         ,false ).
is_two_level_closed_list_test_case_generator( 30, [_,a]         ,false ).
is_two_level_closed_list_test_case_generator( 31, [_,_]         ,false ).
is_two_level_closed_list_test_case_generator( 32, [a|[]]        ,false ).
is_two_level_closed_list_test_case_generator( 33, [a,b|[]]      ,false ).
is_two_level_closed_list_test_case_generator( 34, [a,b,c|[]]    ,false ).
is_two_level_closed_list_test_case_generator( 35, [_|[]]        ,false ).
is_two_level_closed_list_test_case_generator( 36, [_,_|[]]      ,false ).
is_two_level_closed_list_test_case_generator( 37, [_,_,_|[]]    ,false ).
is_two_level_closed_list_test_case_generator( 38, a             ,false ).
is_two_level_closed_list_test_case_generator( 39, 1             ,false ).
is_two_level_closed_list_test_case_generator( 40, _             ,false ).
is_two_level_closed_list_test_case_generator( 41, [a|_]         ,false ).
is_two_level_closed_list_test_case_generator( 42, [_|a]         ,false ).
is_two_level_closed_list_test_case_generator( 43, [_|_]         ,false ).
is_two_level_closed_list_test_case_generator( 44, [[]|_]        ,false ).
is_two_level_closed_list_test_case_generator( 45, [[]|a]        ,false ).
is_two_level_closed_list_test_case_generator( 46, [a|b]         ,false ).
is_two_level_closed_list_test_case_generator( 47, [a,[]]        ,false ).
is_two_level_closed_list_test_case_generator( 48, [[],a]        ,false ).
is_two_level_closed_list_test_case_generator( 49, [[],a,b]      ,false ).
is_two_level_closed_list_test_case_generator( 50, [a,[],b]      ,false ).
is_two_level_closed_list_test_case_generator( 51, [a,b,[]]      ,false ).
is_two_level_closed_list_test_case_generator( 52, [[],[],a,b]   ,false ).
is_two_level_closed_list_test_case_generator( 53, [[],a,[],b]   ,false ).
is_two_level_closed_list_test_case_generator( 54, [[],a,b,[]]   ,false ).
is_two_level_closed_list_test_case_generator( 55, [a,[],[],b]   ,false ).
is_two_level_closed_list_test_case_generator( 56, [a,[],b,[]]   ,false ).
is_two_level_closed_list_test_case_generator( 57, [a,b,[],[]]   ,false ).
is_two_level_closed_list_test_case_generator( 58, [[],a,b,c]    ,false ).
is_two_level_closed_list_test_case_generator( 59, [a,[],b,c]    ,false ).
is_two_level_closed_list_test_case_generator( 60, [a,b,[],c]    ,false ).
is_two_level_closed_list_test_case_generator( 61, [a,b,c,[]]    ,false ).

test(1,[forall(is_two_level_closed_list_test_case_generator(_Test_number,List,Result))]) :-
    (
        is_two_level_closed_list(List)
    ->
        Result = true
    ;
        Result = false
    ).

:- end_tests(is_two_level_closed_list).
_

テストを実行します。

_?- run_tests(is_one_level_closed_list).
% PL-Unit: is_one_level_closed_list ........................................ done
% All 40 tests passed
true.

?- run_tests(is_two_level_closed_list).
% PL-Unit: is_two_level_closed_list ............................................................. done
% All 61 tests passed
true.
_

[〜#〜]編集[〜#〜]

@falseと@repeatによる回答が同じテストケースに合格することを示すため。

At @ false によるコードは、述語名の衝突を回避するために少し変更されました

_list_comb_f(List, Ess) :-
   bagof(Es, maplist(member,Es,List), Ess).
_

@repeatによるコードは、述語名の衝突を回避するために少し変更されました。

_list_comb_r([], [[]]).
list_comb_r([Xs|Xss], Ess) :-
    list_comb_r(Xss,Ess0),
   maplist(aux_x_comb(Ess0), Xs, Esss1),
   append(Esss1, Ess).

aux_x_comb(Ess0, X, Ess1) :-
   maplist(head_tail_list(X), Ess0, Ess1).

head_tail_list(X, Xs, [X|Xs]).
_

空のセットを持つ拡張テストケースを使用したテストを追加しました。 3つの回答すべてに必要なremove_empty(Sets0,Sets)の追加に注意してください。

_test(3,[condition(true),forall(example_06_test_case_generator(_Test_number,Sets0,Expected_result))]) :-
    remove_empty(Sets0,Sets),
    list_comb_r(Sets,Result), % repeat answer

    assertion( Result == Expected_result ).

test(4,[condition(true),forall(example_06_test_case_generator(_Test_number,Sets0,Expected_result))]) :-
    remove_empty(Sets0,Sets),
    list_comb_f(Sets,Result), % false answer

    assertion( Result == Expected_result ).
_

テストの実行

_?- run_tests(example_06:3).
% PL-Unit: example_06:3 ..................................................................... done
% All 69 tests passed
true.

?- run_tests(example_06:4).
% PL-Unit: example_06:4 ..................................................................... done
% All 69 tests passed
true.
_

@falseによる答えを注意深く見なかった人のための1つの追加メモ。

_nilmemberd_t([], false).
nilmemberd_t([X|Xs], T) :-
   if_(nil_t(X), T = true, nilmemberd_t(Xs, T)).

nil_t([], true).
nil_t([_|_], false).

list_comb_f(List, []) :-
   nilmemberd_t(List, true).

if_(If_1, Then_0, Else_0) :-
    call(If_1, T),
    (  T == true -> call(Then_0)
    ;  T == false -> call(Else_0)
    ;  nonvar(T) -> throw(error(type_error(boolean,T),_))
    ;  /* var(T) */ throw(error(instantiation_error,_))
    ).
_
_?- list_comb_f(List,[]).
List = [[]|_5808] ;
List = [[_6490|_6492], []|_6498] ;
List = [[_6490|_6492], [_7180|_7182], []|_7188] ;
List = [[_6490|_6492], [_7180|_7182], [_7870|_7872], []|_7878] ;
List = [[_6490|_6492], [_7180|_7182], [_7870|_7872], [_8560|_8562], []|_8568] ;
List = [[_6490|_6492], [_7180|_7182], [_7870|_7872], [_8560|_8562], [_9250|_9252], []|_9258] 
...
_
0
Guy Coder