| Copyright | (c) Levent Erkok |
|---|---|
| License | BSD3 |
| Maintainer | erkokl@gmail.com |
| Stability | experimental |
| Safe Haskell | None |
| Language | Haskell2010 |
Documentation.SBV.Examples.TP.Coins
Contents
Description
Proving the classic coin change theorem: For any amount n >= 8, you can make
exact change using only 3-cent and 5-cent coins.
This example is inspired by: https://github.com/imandra-ai/imandrax-examples/blob/main/src/coins.iml
Synopsis
- data Pocket = Pocket {}
- cv2Pocket :: String -> [CV] -> Pocket
- _undefiner_Pocket :: a
- type SPocket = SBV Pocket
- sPocket :: SBV Integer -> SBV Integer -> SBV Pocket
- isPocket :: SBV Pocket -> SBool
- getPocket_1 :: SBV Pocket -> SBV Integer
- snum3s :: SBV Pocket -> SBV Integer
- getPocket_2 :: SBV Pocket -> SBV Integer
- snum5s :: SBV Pocket -> SBV Integer
- sCasePocket :: Mergeable result => SBV Pocket -> (SBV Integer -> SBV Integer -> result) -> result
- mkChange :: SInteger -> SMaybe Pocket
- evalPocket :: SMaybe Pocket -> SInteger
- correctness :: TP (Proof (Forall "n" Integer -> SBool))
Types
A pocket contains a count of 3-cent and 5-cent coins.
Instances
_undefiner_Pocket :: a Source #
Autogenerated definition to avoid unused-variable warnings from GHC.
sPocket :: SBV Integer -> SBV Integer -> SBV Pocket Source #
Symbolic version of the constructor Pocket.
sCasePocket :: Mergeable result => SBV Pocket -> (SBV Integer -> SBV Integer -> result) -> result Source #
Case analyzer for the type Pocket.
Making change
mkChange :: SInteger -> SMaybe Pocket Source #
Make change for a given amount. Returns Nothing if the amount is less than 8.
Base cases:
- 8 = 3 + 5
- 9 = 3 + 3 + 3
- 10 = 5 + 5
For n > 10, we use change for n-3 and add one more 3-cent coin.
Correctness
correctness :: TP (Proof (Forall "n" Integer -> SBool)) Source #
Prove that for any n >= 8, mkChange produces a pocket that evaluates to n.
We have:
>>>runTP correctnessInductive lemma (strong): mkChangeCorrect Step: Measure is non-negative Q.E.D. Step: 1 (5 way case split) Step: 1.1 Q.E.D. Step: 1.2 Q.E.D. Step: 1.3 Q.E.D. Step: 1.4 Q.E.D. Step: 1.5.1 Q.E.D. Step: 1.5.2 Q.E.D. Step: 1.5.3 Q.E.D. Step: 1.Completeness Q.E.D. Result: Q.E.D. [Proven] mkChangeCorrect :: Ɐn ∷ Integer → Bool