このディレクトリの索引
#  
#  ある専門学校の受験資格のデシジョンテーブル
#  
#  <条件>            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


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

受験(諦める,諦める,ダイエットして来年受験する,諦める,諦める,諦める,ヨガに一年通ってから受験する,受験してみる).


デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_行動述語名ならび,_選択列,_行動ならび) :-
        デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_選択列),
        findall(_行動,(
                    '行動述語の_選択列引数を得る'(_アリティ,_選択列,_行動述語名ならび,_行動)),
               _行動ならび).

デシジョンテーブル(_,[],_,_選択列).
デシジョンテーブル(_アリティ,[_述語名|R1],[_真偽値|R2],_選択列) :-
        条件述語を実行する(_アリティ,_述語名,_真偽値ならび),
        nth1(_選択列,_真偽値ならび,_真偽値),
        デシジョンテーブル(_アリティ,R1,R2,_選択列).

条件述語を実行する(_アリティ,_述語名,_真偽値ならび) :-
        length(_真偽値ならび,_アリティ),
        P =.. [_述語名|_真偽値ならび],
        call(P).


'行動述語の_選択列引数を得る'(_アリティ,_選択列,_行動述語名ならび,_行動) :-
        member(_行動述語名,_行動述語名ならび),
        行動述語名の行動ならびを得る(_アリティ,_行動述語名,_行動選択ならび),
        nth1(_選択列,_行動選択ならび,_行動).

行動述語名の行動選択ならびを得る(_アリティ,_行動述語名,_行動選択ならび) :-
        length(_行動選択ならび,_アリティ),
        P =.. [_行動述語名|_行動選択ならび],
        call(P).

%  
%  ?- デシジョンテーブル(8,[体重が軽い,体が柔らかい,敏捷である],[真,偽,真],[受験],_選択列,_行動ならび).
%  
%  _選択列 = 7,
%  _行動ならび = [ヨガに一年通ってから受験する]
%