یک کتابفروشی برای تشویق به خرید بیشتر کتابهای مختلف از یک مجموعهی محبوب پنججلدی، تصمیم گرفته است روی خرید چند کتاب با هم تخفیف بدهد.
هر نسخه از هر یک از این پنج کتاب ۸ دلار قیمت دارد.
اما اگر دو کتاب متفاوت بخرید، روی آن دو کتاب ۵٪ تخفیف میگیرید.
اگر ۳ کتاب متفاوت بخرید، ۱۰٪ تخفیف میگیرید.
اگر ۴ کتاب متفاوت بخرید، ۲۰٪ تخفیف میگیرید.
اگر هر ۵ کتاب را بخرید، ۲۵٪ تخفیف میگیرید.
توجه کنید که اگر چهار کتاب بخرید که ۳ تای آنها عنوانهای متفاوتی داشته باشند، روی آن ۳ کتابی که یک مجموعه را تشکیل میدهند ۱۰٪ تخفیف میگیرید، اما کتاب چهارم همچنان ۸ دلار قیمت دارد.
مأموریت شما این است که کدی بنویسید تا قیمت هر سبد خرید قابلتصوری (که فقط شامل کتابهای همین مجموعه باشد) را محاسبه کند، با بیشترین تخفیف ممکن.
برای مثال، قیمت این سبد کتاب چقدر است؟
یک روش برای گروهبندی این ۸ کتاب این است:
که در مجموع به این نتیجه میرسد:
که حاصل آن این است:
که برابر است با ۵۱٫۶۰ دلار.
اما روش دیگری برای گروهبندی این ۸ کتاب وجود دارد:
که در مجموع به این نتیجه میرسد:
که حاصل آن این است:
که برابر است با ۵۱٫۲۰ دلار.
و ۵۱٫۲۰ دلار قیمتی است که بیشترین تخفیف را دارد.
این تمرین یک «زیرنوع» به اسم Book تعریف میکند، برای اعداد طبیعی ۱ تا ۵.
میتوان به زیرنوع به چشم یک جفت ⟨x, h⟩ نگاه کرد که x مقدار آن است و h اثبات معتبر بودنش.
مقدار درون زیرنوع (در این مورد، x) را میتوان با استفاده از .val به دست آورد؛ برای نمونه، x.val.
اثبات آن را هم میتوان با استفاده از .property به دست آورد؛ برای نمونه، x.property.
به هر دوی اینها هم میتوان مثل همیشه از طریق «تطبیق الگو» دسترسی داشت.