見出し画像

「真理値表その2」:関数型プログラミングの初級問題 -41問目- (0分)

 論理についての練習問題と答案です。問題は、OCaml公式ページのものを使いました。答案の作成時間は、0分でした。

問題41.

 問題40と同じです。出題者の出題に臨む心構えが違います。

答案

本問の解き方

 前回の答案で作成した関数table2における無駄な箇所を削除します。

コード

type bool_expr =
 | Var of string
 | Not of bool_expr
 | And of bool_expr*bool_expr
 | Or of bool_expr*bool_expr

let rec value_of key = function
 | [] -> raise (Failure "value_of")
 | (k, v)::tail -> if k = key then v else value_of key tail

let rec eval env =
 function
  | Var (s) -> value_of s env
  | Not (e) -> not (eval env e)
  | And (e1, e2) -> (eval env e1) && (eval env e2)
  | Or (e1, e2) -> (eval env e1) || (eval env e2)

let rec expand =
 let rec append e = function [] -> []
  | head::tail -> (e::head)::append e tail in

 function [] -> []
  | head::[] -> [[(head, true)]; [(head, false)]]
  | head::tail -> (append (head, true) (expand tail))@(append (head, false) (expand tail))

 let table vars expr =
  let rec tbl = function [] -> [] | head::tail -> (head, eval head expr)::tbl tail in

 tbl (expand vars)

感想

 この問題集ではよくあることですが、今回もまた水増しされた問題です。
 出題者としては、問題文は同一でも「僕の考える最強の模範解答」が違うから違う問題だ、ということなのでしょう。スゴイなあ。

 次回は、第42問です。次は内容が変わっているといいですね。

古往今来得ざれば即ち書き得れば即ち飽くは筆の常也。と云うわけで御座います、この浅ましき乞食めに何卒皆々様のご慈悲をお願い致します。