このディレクトリの索引
#  お題:[B下の端に一本だけ当たりが付いているあみだくじについて、
#  当たりくじを引く手を求めよ。橋と橋の交差はないと仮定する。
#  入力データ:くじの本数num。左から数えた当たりくじの位置mark。各橋の両端のくじの位置(left,right)を上から並べたリスト。
#  

'お題:下の端に一本だけ当たりが付いているあみだくじについて、
当たりくじを引く手を求めよ。橋と橋の交差はないと仮定する。
入力データ:くじの本数num。左から数えた当たりくじの位置mark。各橋の両端のくじの位置(left,right)を上から並べたリスト。'(_くじの本数,_当たり) :-
        あみだくじ(_くじの本数,_当たり).


経路((1,1),(1,2)).
経路((1,2),(1,3)).
経路((1,2),(2,3)).
経路((2,1),(2,2)).
経路((2,2),(2,3)).
経路((2,3),(2,4)).
経路((2,2),(3,2)).
経路((3,1),(3,2)).
経路((3,2),(3,3)).

ゴール((1,3)).
ゴール((2,4)).
ゴール((3,3)).

当たりくじ((2,4)).

あみだくじ(_くじの本数,_当たり) :-
        between(1,_くじの本数,_当たり),
        経路((_当たり,1),_次の点),
        あみだくじ(_次の点).

あみだくじ(_現在点) :-
        ゴール(_現在点),!.
あみだくじ(_現在点) :-
        次の点(_現在点,_次の点),
        あみだくじ(_現在点).
        
次の点(_現在点,_次の点) :-
        左から右へ橋を渡る(_現在点,_次の点),!.
次の点(_現在点,_次の点) :-
        右から左へ橋を渡る(_現在点,_次の点),!.
次の点(_現在点,_次の点) :-
        下方へ移動する(_現在点,_次の点).

左から右へ橋を渡る((X,Y),(X_2,Y_2)) :-
        経路((X,Y),(X_2,Y_2)),
        \+(X = X_2),!.

右から左へ橋を渡る((X,Y),(X_2,Y_2)) :-
        経路((X_2,Y_2),(X,Y)),
        \+(X = X_2),!.

下方へ移動する((X,Y),(X,Y_2)) :-
        経路((X,Y),(X,Y_2)),
        Y_2 > Y.