このディレクトリの索引
#
#  findallを使わずに単位節の情報をリストに取り出す述語を定義しなさい。
#

:- dynamic(temp/3).

'findallを使わずに単位節の情報をリストに取り出す'(_述語名,_アリティ,_リスト) :-
        初期化(_述語名,_アリティ,_情報ならび,_目標),
        call(_目標),
        現在の情報番号と次の情報番号を取得する(N1,N2),
        asserta(temp(N1,N2,_情報ならび)),
        fail.
'findallを使わずに単位節の情報をリストに取り出す'(_述語名,_アリティ,_リスト) :-
        temp述語から情報をリストに取り出す(_リスト).

初期化(_述語名,_アリティ,L,_目標) :-
        abolish(temp/3),
        length(L,_アリティ),
        _目標 =.. [_述語名|L].

現在の情報番号と次の情報番号を取得する(N1,N2) :-
        temp(_,N1,_),
        N2 is N1 + 1,!.
現在の情報番号と次の情報番号を取得する(1,2).

temp述語から情報をリストに取り出す(_リスト) :-
        temp(1,N2,L),
        temp述語から情報をリストに取り出す(N2,L,_リスト).

temp述語から情報をリストに取り出す(N1,L,[L|R]) :-
        N2 is N1 + 1,
        temp(N2,N3,L2),
        temp述語から情報をリストに取り出す(N3,L2,R),!.
temp述語から情報をリストに取り出す(_,L,[L]) :-
        abolish(temp/3).