Clojureの真偽値は、trueかfalseで表します。
述語関数(真偽値を返す関数)は、ふつう疑問符(?)で終わりますが、これはあくまで慣習です。
コアライブラリには、not、and、orなどの論理演算子のための関数が用意されています。
この演習では、友人が開発中の新しいRPGゲームのクエストのロジックを実装します。ゲームの主人公はAnnalynで、勇敢な女の子であり、獰猛で忠実なペットの犬を連れています。ところが不幸にも、親友が森で木の実を探しているときに誘拐されてしまいました。Annalynは親友を見つけて助け出そうとします。この冒険に犬を連れていくこともできます。
しばらく足跡をたどったあと、Annalynは親友が囚われている野営地を見つけます。誘拐犯は2人いました。強力な騎士と、ずる賢い弓兵です。
誘拐犯を見つけたAnnalynは、次のどの行動を取れるか考えます。
4つのタスクがあります。森にいる3人の状態と、Annalynのペットの犬がいるかどうかに基づいて、上記の行動が可能かどうかを判断するロジックを実装します。
騎士が起きているかどうかを示す真偽値を受け取るcan-fast-attack?関数を実装します。この関数は、騎士の状態に基づいて速攻できる場合はtrueを返します。そうでなければfalseを返します。
(def knight-awake? true)
(can-fast-attack? knight-awake?)
;;=> false
騎士、弓兵、囚人がそれぞれ起きているかどうかを示す3つの真偽値を受け取るcan-spy?関数を実装します。この関数は、3人の状態に基づいてグループを偵察できる場合はtrueを返します。そうでなければfalseを返します。
(def knight-awake? false)
(def archer-awake? true)
(def prisoner-awake? false)
(can-spy? knight-awake? archer-awake? prisoner-awake?)
;;=> true
弓兵と囚人がそれぞれ起きているかどうかを示す2つの真偽値を受け取るcan-signal-prisoner?関数を実装します。この関数は、2人の状態に基づいて囚人に合図を送れる場合はtrueを返します。そうでなければfalseを返します。
(def archer-awake? false)
(def prisoner-awake? true)
(can-signal-prisoner? archer-awake? prisoner-awake?)
;;=> true
4つの真偽値を受け取るcan-free-prisoner?関数を実装します。最初の3つの仮引数は、騎士、弓兵、囚人がそれぞれ起きているかどうかを示します。最後の仮引数は、Annalynのペットの犬がいるかどうかを示します。この関数は、3人の状態とAnnalynのペットの犬がいるかどうかに基づいて囚人を解放できる場合はtrueを返します。そうでなければfalseを返します。
(def knight-awake? false)
(def archer-awake? true)
(def prisoner-awake? false)
(def dog-present? false)
(can-free-prisoner? knight-awake? archer-awake? prisoner-awake? dog-present?)
;;=> false