cryptol/examples/funstuff/Coins.cry
Robert Dockins cd9ffed00b Update examples to use (/\) instead of (&&) where appropriate,
and to squash other warnings related to the upcomming precedence change.
2016-08-22 18:14:44 -07:00

22 lines
761 B
Plaintext

// Copyright (c) 2015-2016 Galois, Inc.
// The puzzle goes like this:
// You've got 30 coins that add up to $1.09 - what are they?
coinPuzzle : [10] -> [10] -> [10] -> [10] -> Bit
coinPuzzle a b c d = (coinCount a b c d 30) /\ (coinSum a b c d 109)
coinSum : [10] -> [10] -> [10] -> [10] -> [10] -> Bit
coinSum a b c d s = (a + 5 * b + 10 * c + 25 * d) == s
coinCount : [10] -> [10] -> [10] -> [10] -> [10] -> Bit
coinCount a b c d s = (((a + b + c + d) == s) /\ // the coin count adds up
(a <= s /\ b <= s /\ c <= s /\ d <= s)) // and we don't wrap
// run it like this:
// :set satNum = all
// :sat coinPuzzle
// coinPuzzle 19 7 3 1 = True
// coinPuzzle 24 1 3 2 = True
// coinPuzzle 14 13 3 0 = True
// coinPuzzle 19 4 7 0 = True