試験問題

曜日計算を行うモデルを構成せよ。曜日計算とは,月曜日+火曜日=水曜日,水曜日+金曜日=月曜日となるような計算である。
曜日計算には,色々な計算方法が知られているが,一番簡単なものは,曜日を数字に変換し,数字で計算し,結果を再度曜日に戻すという方法である。例えば,水曜日+金曜日ならば,水曜日を3に,金曜日を5に直し,3+5=8として後,8÷7=1…1なので,余りの1を月曜日に直すというやり方である。
モデルは,以下のワーキングメモリの(Add x y)のx,yを書き直すことで,あらゆる曜日の組み合わせの計算が可能なように,変数を用いて記述すること。答えは,(Answer z)のzの値として求められるようにせよ。

モデルは,Daycalcという名前で保存しておくこと。


ワーキングメモリ

以下がワーキングメモリの内容である。
これを,システムのワーキングメモリにコピペせよ。

- (Add WED FRI)
- (Day SUN 0)
- (Day MON 1)
- (Day TUE 2)
- (Day WED 3)
- (Day THR 4)
- (Day FRI 5)
- (Day SAT 6)

ルール

■TransToNum
最初に(Add MON TUE)という曜日計算を,(AddNum 1 2)という数字の計算に変換する。

IF節
(Add # #)
(Day # #)
(Day # #)

THEN節
(*delete (Add # #))
(*deposit (AddNum # #))

■AddNum
次に,(AddNum 1 2)という数字の足し算を行い,結果を(AnswerNum 3)として書き込む。
*plusは足し算を行う関数で,(*plus x y)は,x+yの結果を返す(に置き換わる)。
*moduloは割り算の余りを計算する関数で,(*modulo x y)は,x÷yの余りを返す(に置き換わる)。

IF節
(AddNum # #)

THEN節
(*delete (AddNum # #))
(*deposit (# (*modulo (*plus # #) #)))

■TransToLetter
(AnsserNum 3)の結果を,曜日に置き換えて最終的に(Answer WED)として書き込む。

IF節
(AnswerNum #)
(Day # #)

THEN節
(*delete (AnswerNum #))
(*deposit (Answer #))