このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/621
#  ■DBMS名とバージョン 
#  MySQL 5.0 
#   
#  ■テーブルデータ 
#  店舗テーブル 
#  AreaID      int(1)←この2つでキーになってます 
#  TenpoID     int(1)←この2つでキーになってます 
#  uriage       int(16) 
#   
#  社員テーブル 
#  SyainNo      int(255) 
#  AreaID       int(1) 
#  TenpoID      int(1) 
#  SyainName    varchar(256) 
#   
#  ■欲しい結果 
#   
#  uriageが5000以下の店舗に属してる社員を抜き出す 
#  のと 
#  その社員をいっぺんに消す 
#   
#  どのようにSQL文を書けばいいでしょうか? 
# 
%  
%  この問題のように、findall/3を使って、単位節データベースから読み取る場合は
%  単純にappend/3を使って解を組み上げていくのがよい。
%  

'uriageが5000以下の店舗に属してる社員を抜き出す'(_uriageが5000以下の店舗に属してる社員Noと社員名ならび) :-
        'uriageが5000以下の店舗'(_uriageが5000以下の店舗ならび),
        'uriageが5000以下の店舗に属してる社員を抜き出す'(_uriageが5000以下の店舗,_uriageが5000以下の店舗に属してる社員Noと社員名ならび).

'uriageが5000以下の店舗に属してる社員を抜き出す'([],[]).
'uriageが5000以下の店舗に属してる社員を抜き出す'([[_AreaID,_TempoID]|R1],_uriageが5000以下の店舗に属してる社員Noと社員名ならび) :-
        店舗に属してる社員(_AreaID,_TempoID,_店舗に属してる社員Noと社員名ならび),
        'uriageが5000以下の店舗に属してる社員を抜き出す'(R1,_uriageが5000以下の店舗に属してる社員Noと社員名ならび_1),
        append(_店舗に属してる社員Noと社員名ならび,_uriageが5000以下の店舗に属してる社員Noと社員名ならび_1,_uriageが5000以下の店舗に属してる社員Noと社員名ならび).

'uriageが5000以下の店舗'(_uriageが5000以下の店舗ならび) :-
        findsetof([_AreaID,_TempoID],(
                    店舗(_AreaID,_TempoID,_uriage),
                    _uriage =< 5000),
                _uriageが5000以下の店舗ならび).

店舗に属してる社員(_AreaID,_TempID,_店舗に属してる社員Noと社員名ならび) :-
        findall([_SyainNo,_SyainName],(
                    社員(_SyainNo,_AreaID,_TempoID,_SyainName)),
                _店舗に属してる社員Noと社員名ならび).

'uriageが5000以下の店舗に属してる社員を抜き出した上、その社員をいっぺんに消す' :-
        'uriageが5000以下の店舗に属してる社員を抜き出す'(_uriageが5000以下の店舗に属してる社員Noと社員名ならび),
        append(_,[[_SyainNo,_SyainName]|R],_uriageが5000以下の店舗に属してる社員Noと社員名ならび),
        retract(社員(_SyainNo,_AreaID,_TempoID,_SyainName)),
        R = [].


% findsetof/3