このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/db/1299305530/411
#  MySQL 5.1.46 
#   
#    ≪item≫ 
#  ───────── 
#  id  name  category 
#  ───────── 
#  1  Name1   2 
#  2  Name2   1 
#  3  Name3   1 
#  4  Name4   6 
#  5  Name5   4 
#  6  Name6   8 
#  7  Name7   2 
#  8  Name8   2 
#  ───────── 
#   
#  item 内のデータについて、 category が 2 のものだけ category の値を 7 に振り替えたいと思い 
#   
#  UPDATE item SET category = 7 WHERE category = 2 
#   
#  を発行したのですが、うまく動作しません。 
#  こういう場合にうまくいく方法を教えてください。 
# 
# 

'item 内のデータについて、 category が 2 のものだけ category の値を 7 に振り替えたいと思い' :-
        節順序を変更するupdate(item/3,[[3,2]],[[3,7]]).

節順序を変更するupdate(_述語名/_アリティ,_鍵情報ならび,_更新情報ならび,L) :-
        節順序を変更するupdate(先頭,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび,L),!.

節順序を変更するupdate(先頭,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび) :-
        length(L1,_アリティ),
        鍵情報を設定する(_鍵情報ならび,L1),
        _述語 =.. [_述語名|L1],
        findall(L2,(
                    retract(_述語),
                    更新情報を設定する(_更新情報ならび,L1,L2)),
                L),
        更新ならびを先頭に付加する(_述語名,L),!.
節順序を変更するupdate(末尾,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび) :-
        length(L1,_アリティ),
        鍵情報を設定する(_鍵情報ならび,L1),
        _述語 =.. [_述語名|L1],
        findall(L2,(
                    retract(_述語),
                    更新情報を設定する(_更新情報ならび,L1,L2)),
                L),
        更新ならびを末尾に付加する(_述語名,L),!.

更新ならびを先頭に付加する(_述語名,L) :-
        append(_,[L3|R],L),
        _述語3 =.. [_述語名|L3],
        asserta(_述語3),
        R = [].

更新ならびを末尾に付加する(_述語名,L) :-
        append(_,[L3|R],L),
        _述語3 =.. [_述語名|L3],
        assertz(_述語3),
        R = [].

鍵情報を設定する([],L).
鍵情報を設定する([[_鍵位置,_鍵]|R],L) :-
        nth1(_鍵位置,L,_鍵),
        鍵情報を設定する(R,L).

更新情報を設定する([],L,L).
更新情報を設定する([[_更新位置,_更新値]|R1],L1,L) :-
        append(L0,[_|R],L1),
        length([_|L0],_更新位置),
        append(L0,[_更新値|R],L2),
        更新情報を設定する(R1,L2,L).