در Clojure، مقادیر منطقی با true یا false نمایش داده میشوند.
«توابع محمولی» (توابعی که یک مقدار منطقی برمیگردانند) معمولاً با علامت سؤال (?) پایان مییابند، اما این فقط یک قرارداد است.
کتابخانهی اصلی شامل توابعی برای عملگرهای منطقی مانند not، and و or است.
در این تمرین، منطق ماجراجویی یک بازی نقشآفرینی جدید را پیادهسازی میکنید که یکی از دوستانتان در حال ساخت آن است. شخصیت اصلی بازی آنالین است، دختری شجاع با یک سگ خانگی سرسخت و وفادار. متأسفانه فاجعهای رخ میدهد: بهترین دوستش هنگام جستوجوی توت در جنگل ربوده شده است. آنالین تلاش میکند دوستش را پیدا کند و نجاتش دهد و در این ماجراجویی میتواند سگش را هم با خود ببرد.
پس از مدتی که رد پا را دنبال میکند، آنالین اردوگاهی را پیدا میکند که دوستش در آن زندانی است. معلوم میشود دو آدمربا وجود دارد: یک شوالیهی قدرتمند و یک کماندار حیلهگر.
پس از یافتن آدمرباها، آنالین بررسی میکند که میتواند کدامیک از کارهای زیر را انجام دهد:
شما چهار کار دارید: پیادهسازی منطقی که بر اساس وضعیت سه شخصیت در جنگل و اینکه سگ آنالین حاضر است یا نه، مشخص کند کدامیک از کارهای بالا در دسترس هستند.
تابع can-fast-attack? را پیادهسازی کنید که یک مقدار منطقی میگیرد و نشان میدهد آیا شوالیه بیدار است. این تابع اگر بر اساس وضعیت شوالیه بتوان حملهی سریع انجام داد، true برمیگرداند. در غیر این صورت، false برمیگرداند:
(def knight-awake? true)
(can-fast-attack? knight-awake?)
;;=> false
تابع can-spy? را پیادهسازی کنید که سه مقدار منطقی میگیرد و بهترتیب نشان میدهد آیا شوالیه، کماندار و زندانی بیدار هستند. این تابع اگر بر اساس وضعیت سه شخصیت بتوان از گروه جاسوسی کرد، true برمیگرداند. در غیر این صورت، false برمیگرداند:
(def knight-awake? false)
(def archer-awake? true)
(def prisoner-awake? false)
(can-spy? knight-awake? archer-awake? prisoner-awake?)
;;=> true
تابع can-signal-prisoner? را پیادهسازی کنید که دو مقدار منطقی میگیرد و بهترتیب نشان میدهد آیا کماندار و زندانی بیدار هستند. این تابع اگر بر اساس وضعیت آن دو شخصیت بتوان به زندانی علامت داد، true برمیگرداند. در غیر این صورت، false برمیگرداند:
(def archer-awake? false)
(def prisoner-awake? true)
(can-signal-prisoner? archer-awake? prisoner-awake?)
;;=> true
تابع can-free-prisoner? را پیادهسازی کنید که چهار مقدار منطقی میگیرد. سه پارامتر اول بهترتیب نشان میدهند آیا شوالیه، کماندار و زندانی بیدار هستند. پارامتر آخر نشان میدهد آیا سگ آنالین حاضر است. این تابع اگر بر اساس وضعیت سه شخصیت و حضور سگ آنالین بتوان زندانی را آزاد کرد، 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