このディレクトリの索引

#  [1] 授業単元:プログラミング、関数基礎
#  [2] 問題文(含コード&リンク):
#  メイン関数において、2つの放物線
#   y=ax2+bx+c
#   y=px2+qx+r
#  の係数a、b、c、p、q、rをキーボードから入力し、その数値を関数に引数として渡す。
#  関数はその数値を用いて2曲線の交点の有無を調べ、その交点の個数を戻り値とし
#  てメイン関数に渡す(交点が無い場合は0、交点が1つの場合は1、交点が2つの場
#  合は2、交点が無限に存在する場合はー1を戻り値にする)。また関数は、もし交点が
#  有限個存在するならばそれらの交点の座標値をメイン関数に渡す。メイン関数は関数
#  から得たこれらの情報を得て、交点の個数を画面に表示し、さらにもし交点が有限個
#  存在するならばそれらの座標値を画面に表示する。そのようなプログラムを作成せよ。

'係数a、b、c、p、q、rをキーボードから入力し'(_a,_b,_c,_p,_q,_r) :-
        write('係数a,b,c,p,q,rをカンマ区切りで入力してください : '),
        readln([_a,_b,_c,_p,_q,_r]).

'その数値を用いて2曲線の交点の有無を調べその交点の個数を戻り値としてメイン関数に渡す(交点が無い場合は0、交点が1つの場合は1、交点が2つの場合は2、交点が無限に存在する場合はー1を戻り値にする)'(_a,_b,_c,_p,_q,_r,_戻り値) :-
        'その数値を用いて2曲線の交点の有無を調べ'(_a,_b,_c,_p,_q,_r,_交点の個数),
        '交点が無い場合は0、交点が1つの場合は1、交点が2つの場合は2、交点が無限に存在する場合はー1を戻り値にする'(_交点の個数,_戻り値).

'その数値を用いて2曲線の交点の有無を調べ'(_a,_b,_c,_p,_q,_r,_交点の個数) :-
        A is _a - _p,
        B is _b - _q,
        C is _c - _r,
        判別式の値から交点の個数を得る(A,B,C,_交点の個数),
        '交点が無い場合は0、交点が1つの場合は1、交点が2つの場合は2、交点が無限に存在する場合はー1を戻り値にする'(_交点の個数,_戻り値).

判別式の値から交点の個数を得る(0,B,C,無限に存在する) :- !.
判別式の値から交点の個数を得る(A,B,C,_交点の数) :-
        _判別式の値 is 1.0 * (B * B - 4 * A * C),        
        判別式の値から交点の個数を得る(_判別式の値,_交点の数).
判別式の値から交点の個数を得る(_判別式の値,1) :-
        _判別式の値 = 0.0,!.
判別式の値から交点の個数を得る(_判別式の値,2) :-
        _判別式の値 > 0.0,!.
判別式の値から交点の個数を得る(_判別式の値,なし) :-
        _判別式の値 < 0.0,!.

'交点が無い場合は0、交点が1つの場合は1、交点が2つの場合は2、交点が無限に存在する場合はー1を戻り値にする'(無限に存在する,-1).
'交点が無い場合は0、交点が1つの場合は1、交点が2つの場合は2、交点が無限に存在する場合はー1を戻り値にする'(なし,0).
'交点が無い場合は0、交点が1つの場合は1、交点が2つの場合は2、交点が無限に存在する場合はー1を戻り値にする'(1,1).
'交点が無い場合は0、交点が1つの場合は1、交点が2つの場合は2、交点が無限に存在する場合はー1を戻り値にする'(2,2).