このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1357748713/54
#  [1] プログラミング実習 
#  [2] 課題14-1  http://ime.nu/www.dotup.org/uploda/www.dotup.org3832133.jpg 
#      課題 14-2 http://ime.nu/www.dotup.org/uploda/www.dotup.org3832135.jpg 
#                     14-2の画像はreturn 0; } も追加です 
#    参考課題 http://ime.nu/www.dotup.org/uploda/www.dotup.org3832147.jpg 
#           http://ime.nu/www.dotup.org/uploda/www.dotup.org3832150.jpg 
#           http://ime.nu/www.dotup.org/uploda/www.dotup.org3832153.jpg 
#           http://ime.nu/www.dotup.org/uploda/www.dotup.org3832159.jpg 
#    レベル3問題 http://ime.nu/www.dotup.org/uploda/www.dotup.org3832161.jpg 
#   [3.1] OS Windows 
#   [3.2] リナックスのイーマックスです 
#   [3.3] 言語 C 
#  [4] 1/17 
#  [5] その他の制限:問題文の指示に従って解いてください 青いバックの結果が実行結果 
#  なのでそれになるようお願いします。すべて上からとった写真なので実行結果だけが 
#  違う写真にあることもあります。 
#   
#  よろしくお願いします 
#   
#  お願いします 
# 
#  課題 14-1
#  main関数においてキーボードから入力した2つの数を それぞれ変数a,bに格納(代入、記憶)し、
#  その値をユーザ関数sisokuに渡して、和、差、積、商を計算し、その結果をmain関数に戻して表示するプログラムを作成せよ。
#  ただし、和、差、積、商の計算結果を格納する変数にはグローバル変数を使用すること。
#  このプログラムの動作例を下記に示す。
#  変数aの値を入力
#  5.0
#  変数bの値を入力
#  2.0
#  a=5.000000, b=2.000000
#  和:7.000000, 差:3.000000, 積:10.000000, 商:2.500000
#  
#  (注) 上記の表示のうち、最初の「5.0」「2.0」の値はキーボードから入力される。

:- dynamic(数/2).

数(a,_).
数(b,_).
数(和,_).
数(差,_).
数(積,_).
数(商,_).

'main関数においてキーボードから入力した2つの数を それぞれ変数a,bに格納(代入、記憶)し、
その値をユーザ関数sisokuに渡して、和、差、積、商を計算し、その結果をmain関数に戻して表示するプログラムを作成せよ。
ただし、和、差、積、商の計算結果を格納する変数にはグローバル変数を使用すること。' :-
        'main関数においてキーボードから入力した2つの数を それぞれ変数a,bに格納(代入、記憶)し',
        'その値をユーザ関数sisokuに渡して、和、差、積、商を計算し、'(a,b,和,差,積,商),
        表示する(a,b,和,差,積,商).

'main関数においてキーボードから入力した2つの数を それぞれ変数a,bに格納(代入、記憶)し' :-
        キーボードから入力した2つの数を(_a,_b),
        retract(数(a,_)),
        asserta(数(a,_a)),
        retract(数(b,_)),
        assertz(数(b,_b)).

キーボードから入力した2つの数を(_a,_b) :-
        数を得る(変数aの値,true,_a),
        数を得る(変数bの値,true,_b),!.

'その値をユーザ関数sisokuに渡して、和、差、積、商を計算し、その結果をmain関数に戻して'(_ラベル_a,_ラベル_b,_ラベル_和,_ラベル_差,_ラベル_積,_ラベル_商) :-
        和(_ラベル_a,_ラベル_b,_ラベル_和),
        差(_ラベル_a,_ラベル_b,_ラベル_差),
        積(_ラベル_a,_ラベル_b,_ラベル_積),
        商(_ラベル_a,_ラベル_b,_ラベル_商).

和(_ラベル_a,_ラベル_b,_ラベル_和) :-
        数(_ラベル_a,_a),
        数(_ラベル_b,_b),
        _和 is _a + _b,
        retract(数(_ラベル_和,_)),
        asserta(数(_ラベル_和,_和)).
        
差(_ラベル_a,_ラベル_b,_ラベル_差) :-
        数(_ラベル_a,_a),
        数(_ラベル_b,_b),
        _差 is _a - _b,
        retract(数(_ラベル_差,_)),
        asserta(数(_ラベル_差,_差)).

積(_ラベル_a,_ラベル_b,_ラベル_積) :-
        数(_ラベル_a,_a),
        数(_ラベル_b,_b),
        _積 is _a * _b,
        retract(数(_ラベル_積,_)),
        asserta(数(_ラベル_積,_積)).

商(_ラベル_a,_ラベル_b,_ラベル_積) :-
        数(_ラベル_a,_a),
        数(_ラベル_b,_b),
        _商 is _a / _b,
        retract(数(_ラベル_商,_)),
        asserta(数(_ラベル_商,_商)).

表示する(_ラベル_和,_ラベル_差,_ラベル_積,_ラベル_商) :-
        findall(_数,(
                    member(_ラベル,[_ラベル_和,_ラベル_差,_ラベル_積,_ラベル_商]),
                    数(_ラベル,_数)),
                [_和,_差,_積,_商]),
        writef('%t,:%t, %t:%t, %t:%t, %t:%t\n',[_ラベル_和,_和,_ラベル_差,_差,_ラベル_積,_積,_ラベル商,_商]).


%
%  副作用に徹した述語定義の例
%