このディレクトリの索引
#  
#  ある専門学校の受験資格のデシジョンテーブル
#  
#  <条件>            1   2   3   4   5   6   7   8
#  
#  体重が軽い        N   N   N   N   Y   Y   Y   Y
#  体が柔らかい      N   N   Y   Y   N   Y   N   Y
#  敏捷である        N   Y   Y   N   N   N   Y   Y
#  
#  <行動>
#  
#  受験資格がある                                X
#  受験資格がない    X   X   X   X   X   X   X


体重が軽い(偽,偽,偽,偽,真,真,真,真).
体が柔らかい(偽,偽,真,真,偽,真,偽,真).
敏捷である(偽,真,真,偽,偽,偽,真,真).

受験資格がある(偽,偽,偽,偽,偽,偽,偽,真).
受験資格がない(真,真,真,真,真,真,真,偽).


デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_行動述語名ならび,_nth1,_行動ならび) :-
        デシジョンテーブル引数を取得して転置する(_アリティ,_条件述語名ならび,LL2),
        nth1(_nth1,LL2,_真偽値ならび),
        行動述語から行動ならびを得る(_アリティ,_nth1,_行動述語名ならび,_行動ならび).

デシジョンテーブル引数を取得して転置する(_アリティ,_条件述語名ならび,LL2) :-
        findall(_引数ならび,(
                    member(_条件述語名,_条件述語名ならび),
                    length(_引数ならび,_アリティ),
                    P =.. [_条件述語名|_引数ならび],
                    call(P)),
                LL2),
        転置(LL1,LL2).

行動述語から行動ならびを得る(_アリティ,_nth1,_行動述語名ならび,_行動ならび) :-
        findall(_行動,(
                    '行動述語の_nth1引数を得る'(_アリティ,_nth1,_行動述語名ならび,_行動)),
               _行動ならび).

'行動述語の_nth1引数を得る'(_アリティ,_nth1,_行動述語名ならび,_行動) :-
        member(_行動述語名,_行動述語名ならび),
        length(L,_アリティ),
        P =.. [_行動述語名|L],
        call(P),
        nth1(_nth1,L,_行動).


転置([],[],[]):- !.
転置([[A|R1]|R2],[R1|R3],[A|R4]):-
転置(R2,R3,R4).

転置([[]|_],[]):- !.
転置(L,[L1|R2]):-
転置(L,L2,L1),
転置(L2,R2) .


%  
%  ?- デシジョンテーブル(8,[体重が軽い,体が柔らかい,敏捷である],[真,偽,真],[受験資格がある],_nth1,_行動ならび).
%  
%  _nth1 = 7,
%  _行動ならび = [偽]
%