このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1322562648/142
#  [1] 授業単元:暇つぶし 
#  [2] 問題文: 
#  標準入力より4点 A(x1,y1), B(x2,y2), C(x3,y3), D(x4,y4)の座標が与えられる 
#  座標の数値はいずれも -1000 以上 1000 以下の整数である 
#  線分AB と 線分CD の交点を求め、その座標を小数点以下 20 桁まで表示せよ 
#  線分が重なる場合 および 交点を持たない場合は 無し と表示せよ 
#  但し端点のみが一致する場合はその座標を表示せよ 
#  線分AB および 線分CD の長さは 0 より大きいものとする(A≠B C≠D) 
#   
#   
#  

'標準入力より4点 A(x1,y1), B(x2,y2), C(x3,y3), D(x4,y4)の座標が与えられる。座標の数値はいずれも -1000 以上 1000 以下の整数である。線分AB と 線分CD の交点を求め、その座標を小数点以下 20 桁まで表示せよ' :-
        '標準入力より4点 A(x1,y1), B(x2,y2), C(x3,y3), D(x4,y4)の座標が与えられる。'(_x1,_y1,_x2,_y2),
        '直線の傾きとY軸との接点のY座標'(_x1,_y1,_x2,_y2,_a_1,_b_1),
        '直線の傾きとY軸との接点のY座標'(_x3,_y3,_x4,_y4,_a_2,_b_2),
        二直線の接点の座標を表示する(_a_1,_b_1,_a_2,_b_2).

'標準入力より4点 A(x1,y1), B(x2,y2), C(x3,y3), D(x4,y4)の座標が与えられる。'(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4) :-
        write('各点のx座標y座標をカンマ区切りで入力して下さい\n'),
        findall((X,Y),(
                    member([_点,X,Y],[['A',_x1,_y1],['B',_x2,_y2],['C',_x3,_y3],['D',_x4,_y4]]),
                    writef('%t(x,y)  x,y : ',[_点]),
                    readln([X,Y])),
                L),
        L = [(_x1,_y1),(_x2,_y2),(_x3,_y3),(_x4,_y4)].

'直線の傾きとY軸との接点のY座標'((X1,Y1),(X2,Y2),_傾き,_Y軸との接点のY座標) :-
        _傾き is (Y2-Y1) / (X2-X1),
        _Y軸との接点のY座標 is ((Y1+Y2) - A * (X1+X2)) / 2.
        
二直線の接点の座標を表示する(_a_1,_b_1,_a_2,_b_2) :-
        0 is _a_1 - _a_2,
        write('交点 無し\n'),!.
二直線の接点の座標を表示する(_a_1,_b_1,_a_2,_b_2) :-
        _a_1 = _a_2,
        write('交点 無し\n'),!.
二直線の接点の座標を表示する(_a_1,_b_1,_a_2,_b_2) :-
        _接点のX座標 is (_b_1 - _b_2) / (_a_1 - _a_2),
        _接点のY座標 is (_a_1 * _b_2 - _a_2 * _b_1) / (_a_1 - _a_2),
        format('X座標=~20f,Y座標=~20f\n',[X,Y]).