このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/435
#  ある表の並び順をユーザーが任意に指定できるフィールド sort_key があります。 
#  例) 
#  id,sort_key 
#   1, 3 
#   2, 4 
#   3, 2 
#   4, 5 
#   5, 1 
#  … 
#  この表の任意の行をアプリ側でユーザーが sort_key を変更したあと、 
#  全行の sort_key を振り直すにはどうしたらいいでしょうか? 
# 
# 

:- dynamic(テーブル/2).

'表の任意の行をアプリ側でユーザーが sort_key を変更したあと、全行の sort_key を振り直す'(_id,_変更するsort_key) :-
        sort_keyを後方順位に移動(_id,_変更するsort_key,_sort_key_2),
        sort_key順序をひとつずらす(後方移動,_sort_key_2,_変更するsort_key).
'表の任意の行をアプリ側でユーザーが sort_key を変更したあと、全行の sort_key を振り直す'(_id,_変更するsort_key) :-
        sort_keyを前方順位に移動(_id,_変更するsort_key,_sort_key_2),
        sort_key順序をひとつずらす(前方移動,_sort_key_1,_変更するsort_key).

sort_keyを後方順位に移動(_id,_変更するsort_key,_sort_key_2) :-
        テーブル(_id,_sort_key),
        _sort_key =< _変更するsort_key,
        テーブルの書き換え(_id,_sort_key,_変更するsort_key),
        _sort_key_2 is _sort_key + 1.

sort_keyを前方順位に移動(_id,_変更するsort_key,_sort_key_2) :-
        テーブル(_id,_sort_key),
        _sort_key >= _変更するsort_key,
        テーブルの書き換え(_id,_sort_key,_変更するsort_key),
        _sort_key_1 is _sort_key - 1.

sort_key順序を後方にひとつずらす(_sort_key,_変更するsort_key) :-
        _sort_key > _変更するsort_key,!.
sort_key順序を後方にひとつずらす(_sort_key,_変更するsort_key) :-
        '変更対象節の書き換え(後方移動)'(_sort_key),
        _sort_key_2 is _sort_key + 1,
        sort_key順序を後方にひとつずらす(_sort_key_2,_変更するsort_key).

sort_key順序を前方にひとつずらす(_sort_key,_変更するsort_key) :-
        _sort_key < _変更するsort_key,!.
sort_key順序を前方にひとつずらす(_sort_key,_変更するsort_key) :-
        '変更対象節の書き換え(前方移動)'(_sort_key),
        _sort_key_1 is _sort_key - 1,
        sort_key順序を前方にひとつずらす(_sort_key_1,_変更するsort_key).

'変更対象節の書き換え(後方移動)'(_sort_key) :-
        _sort_key_1 is _sort_key - 1,
        テーブルの書き換え(_id,_sort_key,_id_sort_key_1).

'変更対象節の書き換え(前方移動)'(_sort_key) :-
        _sort_key_2 is _sort_key + 1,
        テーブルの書き換え(_id,_sort_key,_id_sort_key_2).

テーブルの書き換え(_id,_sort_key,_id_sort_key_1) :-
        retract(テーブル(_id,_sort_key)),
        assertz(テーブル(_id,_sort_key_1)).