このディレクトリの索引
#  
#  出典 :: 竹渕瑛一氏のtwitter 20140417より
#  

各駅下り(_駅) :-
        下り起点駅(_下り起点駅),
        下り終点駅(_下り起点駅,_下り終点駅),
        各駅下り(_下り起点駅,_下り終点駅,_駅).

下り起点駅(_下り起点駅) :-
        駅が隣接する(_下り起点駅,_),!.

下り終点駅(_駅,_下り終点駅) :-
        駅が隣接する(_駅,_次の駅),
        下り終点駅(_次の駅,_下り終点駅).
下り終点駅(_下り終点駅,_下り終点駅).

各駅上り(_駅) :-
        上り終点駅(_上り終点駅),
        上り起点駅(_上り終点駅,_下り起点駅),
        各駅上り(_上り起点駅,_上り終点駅,_駅).

上り終点駅(_上り終点駅) :-
        駅が隣接する(_上り終点駅,_),!.

上り起点駅(_駅,_上り起点駅) :-
        駅が隣接する(_駅,_次の駅),
        上り起点駅(_次の駅,_上り起点駅).
上り起点駅(_上り起点駅,_上り起点駅).


各駅下り(_起点駅,_終点駅,_終点駅) :-
        起点駅が終点駅に到達(_起点駅,_終点駅),!.
各駅下り(_起点駅,_終点駅,_駅) :-
        駅が隣接する(_起点駅,_駅_2),
        この先に終点駅がある(_起点駅,_終点駅),
        各駅下り(_起点駅,_終点駅,_駅_2,_駅).
各駅下り(_駅,_,_駅) :-
        \+(駅が隣接する(_駅,_)).

各駅下り(_駅,_,_,_駅).
各駅下り(_,_終点駅,_駅_2,_駅) :-
        各駅下り(_駅_2,_終点駅,_駅).

この先に終点駅がある(_,_終点駅) :-
        var(_終点駅),!.
この先に終点駅がある(_起点駅,_) :-
        var(_起点駅),!.
この先に終点駅がある(_終点駅,_終点駅) :- !.
この先に終点駅がある(_駅,_終点駅) :-
        駅が隣接する(_駅,_次の駅),
        この先に終点駅がある(_次の駅,_終点駅).

各駅上り(_起点駅,_終点駅,_終点駅) :-
        起点駅が終点駅に到達(_起点駅,_終点駅),!.
各駅上り(_起点駅,_終点駅,_駅) :-
        駅が隣接する(_駅_2,_起点駅),
        この前に終点駅がある(_起点駅,_終点駅),
        各駅上り(_起点駅,_終点駅,_駅_2,_駅).
各駅上り(_駅,_,_駅) :-
        \+(駅が隣接する(_,_駅)).

各駅上り(_駅,_,_,_駅).
各駅上り(_,_終点駅,_駅_2,_駅) :-
        各駅上り(_駅_2,_終点駅,_駅).

この前に終点駅がある(_,_終点駅) :-
        var(_終点駅),!.
この前に終点駅がある(_起点駅,_) :-
        var(_起点駅),!.
この前に終点駅がある(_終点駅,_終点駅) :- !.
この前に終点駅がある(_駅,_終点駅) :-
        駅が隣接する(_次の駅,_駅),
        この前に終点駅がある(_次の駅,_終点駅).

起点駅が終点駅に到達(_起点駅,_終点駅) :-
        var(_起点駅),
        var(_終点駅),!,fail.
起点駅が終点駅に到達(_起点駅,_終点駅) :-
        var(_起点駅),!,fail.
起点駅が終点駅に到達(_起点駅,_終点駅) :-
        \+(var(_起点駅)),
        \+(var(_終点駅)),
        _起点駅 = _終点駅,!.

駅(相模大野).
駅(東林間).
駅(中央林間).
駅(南林間).
駅(鶴間).
駅(大和).
駅(桜ヶ丘).
駅(高座渋谷).
駅(長後).
駅(湘南台).
駅(六会日大前).
駅(善行).
駅(藤沢本町).
駅(藤沢).
駅(本鵠沼).
駅(鵠沼海岸).
駅(片瀬江ノ島).

駅が隣接する(相模大野, 東林間).
駅が隣接する(東林間, 中央林間).
駅が隣接する(中央林間, 南林間).
駅が隣接する(南林間, 鶴間).
駅が隣接する(鶴間, 大和).
駅が隣接する(大和, 桜ヶ丘).
駅が隣接する(桜ヶ丘, 高座渋谷).
駅が隣接する(高座渋谷, 長後).
駅が隣接する(長後, 湘南台).
駅が隣接する(湘南台, 六会日大前).
駅が隣接する(六会日大前, 善行).
駅が隣接する(善行, 藤沢本町).
駅が隣接する(藤沢本町, 藤沢).
駅が隣接する(藤沢, 本鵠沼).
駅が隣接する(本鵠沼, 鵠沼海岸).
駅が隣接する(鵠沼海岸, 片瀬江ノ島).

/*
各駅下り(相模大野, 東林間).
各駅下り(東林間, 中央林間).
各駅下り(中央林間, 南林間).
各駅下り(南林間, 鶴間).
各駅下り(鶴間, 大和).
各駅下り(大和, 桜ヶ丘).
各駅下り(桜ヶ丘, 高座渋谷).
各駅下り(高座渋谷, 長後).
各駅下り(長後, 湘南台).
各駅下り(湘南台, 六会日大前).
各駅下り(六会日大前, 善行).
各駅下り(善行, 藤沢本町).
各駅下り(藤沢本町, 藤沢).
各駅下り(藤沢, 本鵠沼).
各駅下り(本鵠沼, 鵠沼海岸).
各駅下り(鵠沼海岸, 片瀬江ノ島).

各駅上り(片瀬江ノ島, 鵠沼海岸).
各駅上り(鵠沼海岸, 本鵠沼).
各駅上り(本鵠沼, 藤沢).
各駅上り(藤沢, 藤沢本町).
各駅上り(藤沢本町, 善行).
各駅上り(善行, 六会日大前).
各駅上り(六会日大前, 湘南台).
各駅上り(湘南台, 長後).
各駅上り(長後, 高座渋谷).
各駅上り(高座渋谷, 桜ヶ丘).
各駅上り(桜ヶ丘, 大和).
各駅上り(大和, 鶴間).
各駅上り(鶴間, 南林間).
各駅上り(南林間, 中央林間).
各駅上り(中央林間, 東林間).
各駅上り(東林間, 相模大野).
*/

急行停車駅(相模大野).
急行停車駅(藤沢).
急行停車駅(片瀬江ノ島).
急行停車駅(長後).
急行停車駅(本鵠沼).
急行停車駅(鵠沼海岸).
急行停車駅(南林間).
急行停車駅(大和).
急行停車駅(南林間).
急行停車駅(湘南台).

駅間距離(相模大野, 東林間, 1.7).
駅間距離(東林間, 中央林間, 1.3).
駅間距離(中央林間, 南林間, 1.5).
駅間距離(南林間, 鶴間, 0.6).
駅間距離(鶴間, 大和, 2.5).
駅間距離(大和, 桜ヶ丘, 2.2).
駅間距離(桜ヶ丘, 高座渋谷, 2.0).
駅間距離(高座渋谷, 長後, 2.2).
駅間距離(長後, 湘南台, 1.8).
駅間距離(湘南台, 六会日大前, 1.5).
駅間距離(六会日大前, 善行, 2.4).
駅間距離(善行, 藤沢本町, 1.6).
駅間距離(藤沢本町, 藤沢, 1.8).
駅間距離(藤沢, 本鵠沼, 1.5).
駅間距離(本鵠沼, 鵠沼海岸, 1.3).
駅間距離(鵠沼海岸, 片瀬江ノ島, 1.7).

駅のならびを得る([_起点となる駅|L]) :-
        駅が隣接する(_起点となる駅,_),!,
        findall(_駅,駅が隣接する(_,_駅),L).

全ての急行区間(_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび) :-
        駅のならびを得る(_駅のならび),
        全ての急行区間(_駅のならび,_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび).
全ての急行区間(_終点駅,_始点駅,_急行区間駅ならび,_急行停車駅ならび) :-
        駅のならびを得る(_駅のならび),
        reverse(_駅のならび,_反転した駅のならび),
        全ての急行区間(_反転した駅のならび,_終点駅,_始点駅,_急行区間駅ならび,_急行停車駅ならび).

全ての急行区間(_駅のならび,_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび) :-
        append(L1,[_始点駅|R],_駅のならび),
        last(R,_終点駅),
        _急行区間駅ならび = [_始点駅|R],
        findall(_駅,(
                    member(_駅,[_始点駅|R]),
                    急行停車駅(_駅)),
                _急行停車駅ならび).

last([A],A) :- !.
last([_|R],A) :-
        last(R,A).

急行を使って停車駅を最小にする(_出発点駅,_到着点駅,_駅のならび,_出発駅から急行区間までの各駅停車駅ならび,_急行区間駅ならび,_終点急行停止駅から到着駅までの各駅停車駅ならび) :-
        append(L1,_急行区間駅ならび,L2,_駅のならび),
        全ての急行区間(_,_,_急行区間駅ならび,_),
        出発駅から急行区間までの駅ならび(_出発駅,L1,_出発駅から急行区間までの各駅停車駅ならび),
        終点急行停止駅から到着駅までの各駅停車駅ならび(_到着点駅,L2,_終点急行停止駅から到着駅までの各駅停車駅ならび).

出発駅から急行区間までの駅ならび(_出発駅,L1,_出発駅から急行区間までの各駅停車駅ならび) :-
        append(_,[_出発駅|_出発駅から急行区間までの各駅停車駅ならび],L1),
        \+((member(_駅,_出発駅から急行区間までの各駅停車駅ならび),急行停車駅(_駅))).

終点急行停止駅から到着駅までの各駅停車駅ならび(_到着点駅,L2,_終点急行停止駅から到着駅までの各駅停車駅ならび) :-
        append(_終点急行停止駅から到着駅までの駅ならび,[_到着点駅|_],L2),
        \+((member(_駅,_終点急行停止駅から到着駅までの駅ならび),急行停車駅(_駅))).


区間距離(_起点駅,_終点駅,_区間距離) :-
        区間距離(_起点駅,_終点駅,0.0,_区間距離),!.
区間距離(_起点駅,_終点駅,_区間距離) :-
        区間距離(_終点駅,_起点駅,_区間距離).

区間距離(_終点駅,_終点駅,_区間距離,_区間距離) :- !.
区間距離(_駅,_終点駅,_区間距離_1,_区間距離) :-
        駅間距離(_駅,_次の駅,_駅間距離),
        _区間距離_2 is _区間距離_1 + _駅間距離,
        区間距離(_次の駅,_終点駅,_区間距離_2,_区間距離).

append([],L2,L3,L4) :-
        append(L2,L3,L4).
append([U|L1],L2,L3,[U|L4]) :-
        append(L1,L2,L3,L4).