{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wall -Werror #-}
module Documentation.SBV.Examples.TP.Ackermann where
import Data.SBV
import Data.SBV.Tuple
import Data.SBV.TP
#ifdef DOCTEST
#endif
ack :: SInteger -> SInteger -> SInteger -> SInteger
ack :: SInteger -> SInteger -> SInteger -> SInteger
ack = String
-> (SInteger -> SInteger -> SInteger -> SInteger)
-> SInteger
-> SInteger
-> SInteger
-> SInteger
forall a.
(SMTDefinable a, Typeable a, Lambda Symbolic a) =>
String -> a -> a
smtFunction String
"ack" ((SInteger -> SInteger -> SInteger -> SInteger)
-> SInteger -> SInteger -> SInteger -> SInteger)
-> (SInteger -> SInteger -> SInteger -> SInteger)
-> SInteger
-> SInteger
-> SInteger
-> SInteger
forall a b. (a -> b) -> a -> b
$ \SInteger
m SInteger
n SInteger
a ->
SBool -> SInteger -> SInteger -> SInteger
forall a. Mergeable a => SBool -> a -> a -> a
ite (SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.<= SInteger
0) (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
a)
(SInteger -> SInteger) -> SInteger -> SInteger
forall a b. (a -> b) -> a -> b
$ SBool -> SInteger -> SInteger -> SInteger
forall a. Mergeable a => SBool -> a -> a -> a
ite (SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.<= SInteger
0) SInteger
0
(SInteger -> SInteger) -> SInteger -> SInteger
forall a b. (a -> b) -> a -> b
$ SBool -> SInteger -> SInteger -> SInteger
forall a. Mergeable a => SBool -> a -> a -> a
ite (SInteger
n SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
1) SInteger
a
(SInteger -> SInteger) -> SInteger -> SInteger
forall a b. (a -> b) -> a -> b
$ SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger -> SInteger -> SInteger -> SInteger
ack SInteger
m (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) SInteger
a) SInteger
a
pet :: SInteger -> SInteger -> SInteger
pet :: SInteger -> SInteger -> SInteger
pet = String
-> (SInteger -> SInteger -> SInteger)
-> SInteger
-> SInteger
-> SInteger
forall a.
(SMTDefinable a, Typeable a, Lambda Symbolic a) =>
String -> a -> a
smtFunction String
"pet" ((SInteger -> SInteger -> SInteger)
-> SInteger -> SInteger -> SInteger)
-> (SInteger -> SInteger -> SInteger)
-> SInteger
-> SInteger
-> SInteger
forall a b. (a -> b) -> a -> b
$ \SInteger
m SInteger
n ->
SBool -> SInteger -> SInteger -> SInteger
forall a. Mergeable a => SBool -> a -> a -> a
ite (SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.<= SInteger
0) (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
1)
(SInteger -> SInteger) -> SInteger -> SInteger
forall a b. (a -> b) -> a -> b
$ SBool -> SInteger -> SInteger -> SInteger
forall a. Mergeable a => SBool -> a -> a -> a
ite (SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.<= SInteger
0) (SInteger -> SInteger -> SInteger
pet (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) SInteger
1)
(SInteger -> SInteger) -> SInteger -> SInteger
forall a b. (a -> b) -> a -> b
$ SInteger -> SInteger -> SInteger
pet (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger -> SInteger -> SInteger
pet SInteger
m (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1))
ack_2_2_4 :: TP (Proof (Forall "m" Integer -> SBool))
ack_2_2_4 :: TP (Proof (Forall "m" Integer -> SBool))
ack_2_2_4 = String
-> (Forall "m" Integer -> SBool)
-> (MeasureArgs (Forall "m" Integer -> SBool) Integer, [ProofObj])
-> (Proof (Forall "m" Integer -> SBool)
-> StepArgs (Forall "m" Integer -> SBool) Integer)
-> TP (Proof (Forall "m" Integer -> SBool))
forall a m t.
(SInductive a, Proposition a, Zero m, SymVal t,
EqSymbolic (SBV t)) =>
String
-> a
-> (MeasureArgs a m, [ProofObj])
-> (Proof a -> StepArgs a t)
-> TP (Proof a)
forall m t.
(Proposition (Forall "m" Integer -> SBool), Zero m, SymVal t,
EqSymbolic (SBV t)) =>
String
-> (Forall "m" Integer -> SBool)
-> (MeasureArgs (Forall "m" Integer -> SBool) m, [ProofObj])
-> (Proof (Forall "m" Integer -> SBool)
-> StepArgs (Forall "m" Integer -> SBool) t)
-> TP (Proof (Forall "m" Integer -> SBool))
sInduct String
"ack_2_2_4"
(\(Forall SInteger
m) -> SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.=> SInteger -> SInteger -> SInteger -> SInteger
ack SInteger
m SInteger
2 SInteger
2 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
4)
(MeasureArgs (Forall "m" Integer -> SBool) Integer
SInteger -> SInteger
forall a. a -> a
id, []) ((Proof (Forall "m" Integer -> SBool)
-> StepArgs (Forall "m" Integer -> SBool) Integer)
-> TP (Proof (Forall "m" Integer -> SBool)))
-> (Proof (Forall "m" Integer -> SBool)
-> StepArgs (Forall "m" Integer -> SBool) Integer)
-> TP (Proof (Forall "m" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\Proof (Forall "m" Integer -> SBool)
ih SInteger
m -> [SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0]
[SBool] -> TPProofRaw SInteger -> (SBool, TPProofRaw SInteger)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- SInteger -> SInteger -> SInteger -> SInteger
ack SInteger
m SInteger
2 SInteger
2
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: [(SBool, TPProofRaw SInteger)] -> TPProofRaw SInteger
forall a. [(SBool, TPProofRaw a)] -> TPProofRaw a
cases [ SInteger
m SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0 SBool -> TPProofRaw SInteger -> (SBool, TPProofRaw SInteger)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> TPProofRaw SInteger
forall a. Trivial a => a
trivial
, SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
0 SBool -> TPProofRaw SInteger -> (SBool, TPProofRaw SInteger)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> SInteger -> SInteger -> SInteger -> SInteger
ack SInteger
m SInteger
2 SInteger
2
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger -> SInteger -> SInteger -> SInteger
ack SInteger
m SInteger
1 SInteger
2) SInteger
2
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) SInteger
2 SInteger
2
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "m" Integer -> SBool)
ih Proof (Forall "m" Integer -> SBool)
-> IArgs (Forall "m" Integer -> SBool) -> Proof Bool
forall a. Instantiatable a => Proof a -> IArgs a -> Proof Bool
`at` forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"m" (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1)
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: (SInteger
4 :: SInteger)
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: ChainsTo SInteger
TPProofRaw SInteger
forall a. TPProofRaw a
qed
]
ack_psd :: TP (Proof (Forall "m" Integer -> Forall "n" Integer -> Forall "a" Integer -> SBool))
ack_psd :: TP
(Proof
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool))
ack_psd = String
-> (Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
-> (MeasureArgs
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
(Integer, Integer),
[ProofObj])
-> (Proof
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
-> StepArgs
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
Bool)
-> TP
(Proof
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool))
forall a m t.
(SInductive a, Proposition a, Zero m, SymVal t,
EqSymbolic (SBV t)) =>
String
-> a
-> (MeasureArgs a m, [ProofObj])
-> (Proof a -> StepArgs a t)
-> TP (Proof a)
forall m t.
(Proposition
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool),
Zero m, SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
-> (MeasureArgs
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
m,
[ProofObj])
-> (Proof
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
-> StepArgs
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
t)
-> TP
(Proof
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool))
sInduct String
"ack_psd"
(\(Forall SInteger
m) (Forall SInteger
n) (Forall SInteger
a) ->
SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.=> SInteger -> SInteger -> SInteger -> SInteger
ack SInteger
m SInteger
n SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0)
(\SInteger
m SInteger
n SInteger
_a -> (SInteger, SInteger) -> SBV (Integer, Integer)
forall tup a. Tuple tup a => a -> SBV tup
tuple (SInteger
m, SInteger
n), []) ((Proof
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
-> StepArgs
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
Bool)
-> TP
(Proof
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)))
-> (Proof
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
-> StepArgs
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
Bool)
-> TP
(Proof
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\Proof
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
ih SInteger
m SInteger
n SInteger
a -> [SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0, SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0, SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0]
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- SInteger -> SInteger -> SInteger -> SInteger
ack SInteger
m SInteger
n SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: [(SBool, TPProofRaw SBool)] -> TPProofRaw SBool
forall a. [(SBool, TPProofRaw a)] -> TPProofRaw a
cases [ SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.<= SInteger
0 SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> TPProofRaw SBool
forall a. Trivial a => a
trivial
, SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.<= SInteger
0 SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> TPProofRaw SBool
forall a. Trivial a => a
trivial
, SInteger
n SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
1 SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> TPProofRaw SBool
forall a. Trivial a => a
trivial
, SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
0 SBool -> SBool -> SBool
.&& SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
1
SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> SInteger -> SInteger -> SInteger -> SInteger
ack SInteger
m SInteger
n SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger -> SInteger -> SInteger -> SInteger
ack SInteger
m (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) SInteger
a) SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
ih Proof
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
-> IArgs
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
-> Proof Bool
forall a. Instantiatable a => Proof a -> IArgs a -> Proof Bool
`at` (forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"m" SInteger
m, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"n" (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"a" SInteger
a)
TPProofRaw SBool -> Proof Bool -> Hinted (TPProofRaw SBool)
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
ih Proof
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
-> IArgs
(Forall "m" Integer
-> Forall "n" Integer -> Forall "a" Integer -> SBool)
-> Proof Bool
forall a. Instantiatable a => Proof a -> IArgs a -> Proof Bool
`at` (forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"m" (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"n" (SInteger -> SInteger -> SInteger -> SInteger
ack SInteger
m (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) SInteger
a), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"a" SInteger
a)
Hinted (TPProofRaw SBool)
-> ChainsTo (Hinted (TPProofRaw SBool))
-> ChainsTo (Hinted (TPProofRaw SBool))
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SBool
sTrue
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: ChainsTo SBool
TPProofRaw SBool
forall a. TPProofRaw a
qed
]
pet_psd :: TP (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool))
pet_psd :: TP (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool))
pet_psd = do
String
-> (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> (MeasureArgs
(Forall "m" Integer -> Forall "n" Integer -> SBool)
(Integer, Integer),
[ProofObj])
-> (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> StepArgs
(Forall "m" Integer -> Forall "n" Integer -> SBool) Bool)
-> TP (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool))
forall a m t.
(SInductive a, Proposition a, Zero m, SymVal t,
EqSymbolic (SBV t)) =>
String
-> a
-> (MeasureArgs a m, [ProofObj])
-> (Proof a -> StepArgs a t)
-> TP (Proof a)
forall m t.
(Proposition (Forall "m" Integer -> Forall "n" Integer -> SBool),
Zero m, SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> (MeasureArgs
(Forall "m" Integer -> Forall "n" Integer -> SBool) m,
[ProofObj])
-> (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> StepArgs (Forall "m" Integer -> Forall "n" Integer -> SBool) t)
-> TP (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool))
sInduct String
"pet_psd"
(\(Forall SInteger
m) (Forall SInteger
n) -> SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.=> SInteger -> SInteger -> SInteger
pet SInteger
m SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0)
(\SInteger
m SInteger
n -> (SInteger, SInteger) -> SBV (Integer, Integer)
forall tup a. Tuple tup a => a -> SBV tup
tuple (SInteger
m, SInteger
n), []) ((Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> StepArgs
(Forall "m" Integer -> Forall "n" Integer -> SBool) Bool)
-> TP (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)))
-> (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> StepArgs
(Forall "m" Integer -> Forall "n" Integer -> SBool) Bool)
-> TP (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
ih SInteger
m SInteger
n -> [SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0, SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0]
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- SInteger -> SInteger -> SInteger
pet SInteger
m SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: [(SBool, TPProofRaw SBool)] -> TPProofRaw SBool
forall a. [(SBool, TPProofRaw a)] -> TPProofRaw a
cases [ SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.<= SInteger
0 SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> TPProofRaw SBool
forall a. Trivial a => a
trivial
, SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
0 SBool -> SBool -> SBool
.&& SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.<= SInteger
0
SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> SInteger -> SInteger -> SInteger
pet SInteger
m SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
pet (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) SInteger
1 SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
ih Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> IArgs (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> Proof Bool
forall a. Instantiatable a => Proof a -> IArgs a -> Proof Bool
`at` (forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"m" (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"n" (SInteger
1 :: SInteger))
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SBool
sTrue
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: ChainsTo SBool
TPProofRaw SBool
forall a. TPProofRaw a
qed
, SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
0 SBool -> SBool -> SBool
.&& SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
0
SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> SInteger -> SInteger -> SInteger
pet SInteger
m SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
pet (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger -> SInteger -> SInteger
pet SInteger
m (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1)) SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
ih Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> IArgs (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> Proof Bool
forall a. Instantiatable a => Proof a -> IArgs a -> Proof Bool
`at` (forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"m" SInteger
m, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"n" (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1))
TPProofRaw SBool -> Proof Bool -> Hinted (TPProofRaw SBool)
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
ih Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> IArgs (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> Proof Bool
forall a. Instantiatable a => Proof a -> IArgs a -> Proof Bool
`at` (forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"m" (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"n" (SInteger -> SInteger -> SInteger
pet SInteger
m (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1)))
Hinted (TPProofRaw SBool)
-> ChainsTo (Hinted (TPProofRaw SBool))
-> ChainsTo (Hinted (TPProofRaw SBool))
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SBool
sTrue
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: ChainsTo SBool
TPProofRaw SBool
forall a. TPProofRaw a
qed
]
petAck :: TP (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool))
petAck :: TP (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool))
petAck = do
Proof (Forall "m" Integer -> SBool)
ack224 <- TP (Proof (Forall "m" Integer -> SBool))
ack_2_2_4
Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
psd <- TP (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool))
pet_psd
String
-> (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> (MeasureArgs
(Forall "m" Integer -> Forall "n" Integer -> SBool)
(Integer, Integer),
[ProofObj])
-> (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> StepArgs
(Forall "m" Integer -> Forall "n" Integer -> SBool) Bool)
-> TP (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool))
forall a m t.
(SInductive a, Proposition a, Zero m, SymVal t,
EqSymbolic (SBV t)) =>
String
-> a
-> (MeasureArgs a m, [ProofObj])
-> (Proof a -> StepArgs a t)
-> TP (Proof a)
forall m t.
(Proposition (Forall "m" Integer -> Forall "n" Integer -> SBool),
Zero m, SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> (MeasureArgs
(Forall "m" Integer -> Forall "n" Integer -> SBool) m,
[ProofObj])
-> (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> StepArgs (Forall "m" Integer -> Forall "n" Integer -> SBool) t)
-> TP (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool))
sInduct String
"petAck"
(\(Forall SInteger
m) (Forall SInteger
n) ->
SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
0 SBool -> SBool -> SBool
.&& SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.=> SInteger -> SInteger -> SInteger
pet SInteger
m SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3) SInteger
2)
(\SInteger
m SInteger
n -> (SInteger, SInteger) -> SBV (Integer, Integer)
forall tup a. Tuple tup a => a -> SBV tup
tuple (SInteger
m, SInteger
n), []) ((Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> StepArgs
(Forall "m" Integer -> Forall "n" Integer -> SBool) Bool)
-> TP (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)))
-> (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> StepArgs
(Forall "m" Integer -> Forall "n" Integer -> SBool) Bool)
-> TP (Proof (Forall "m" Integer -> Forall "n" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
ih SInteger
m SInteger
n -> [SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
0, SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0]
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- SInteger -> SInteger -> SInteger
pet SInteger
m SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3) SInteger
2
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: [(SBool, TPProofRaw SBool)] -> TPProofRaw SBool
forall a. [(SBool, TPProofRaw a)] -> TPProofRaw a
cases [ SInteger
m SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
1 SBool -> SBool -> SBool
.&& SInteger
n SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0
SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> TPProofRaw SBool
forall a. Trivial a => a
trivial
, SInteger
m SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
1 SBool -> SBool -> SBool
.&& SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
0
SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> SInteger -> SInteger -> SInteger
pet SInteger
1 SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger -> SInteger
ack SInteger
0 (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3) SInteger
2
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
pet SInteger
0 (SInteger -> SInteger -> SInteger
pet SInteger
1 (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1)) SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3) SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
2
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
ih Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> IArgs (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> Proof Bool
forall a. Instantiatable a => Proof a -> IArgs a -> Proof Bool
`at` (forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"m" (SInteger
1 :: SInteger), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"n" (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1))
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SBool
sTrue
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: ChainsTo SBool
TPProofRaw SBool
forall a. TPProofRaw a
qed
, SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
1 SBool -> SBool -> SBool
.&& SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.<= SInteger
0
SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> SInteger -> SInteger -> SInteger
pet SInteger
m SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3) SInteger
2
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
pet (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) SInteger
1 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3) SInteger
2
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
pet (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) SInteger
1 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
2) (SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
2) SInteger
2) SInteger
2
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
ih Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> IArgs (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> Proof Bool
forall a. Instantiatable a => Proof a -> IArgs a -> Proof Bool
`at` (forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"m" (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"n" (SInteger
1 :: SInteger))
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
2) SInteger
4 SInteger
2 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
2) (SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
2) SInteger
2) SInteger
2
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "m" Integer -> SBool)
ack224 Proof (Forall "m" Integer -> SBool)
-> IArgs (Forall "m" Integer -> SBool) -> Proof Bool
forall a. Instantiatable a => Proof a -> IArgs a -> Proof Bool
`at` forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"m" (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SBool
sTrue
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: ChainsTo SBool
TPProofRaw SBool
forall a. TPProofRaw a
qed
, SInteger
m SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
1 SBool -> SBool -> SBool
.&& SInteger
n SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
0
SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> SInteger -> SInteger -> SInteger
pet SInteger
m SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3) SInteger
2
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
pet (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger -> SInteger -> SInteger
pet SInteger
m (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1)) SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3) SInteger
2
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
pet (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger -> SInteger -> SInteger
pet SInteger
m (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1)) SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
2) (SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
2) SInteger
2) SInteger
2
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
psd Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> IArgs (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> Proof Bool
forall a. Instantiatable a => Proof a -> IArgs a -> Proof Bool
`at` (forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"m" SInteger
m, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"n" (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1))
TPProofRaw SBool -> Proof Bool -> Hinted (TPProofRaw SBool)
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
ih Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> IArgs (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> Proof Bool
forall a. Instantiatable a => Proof a -> IArgs a -> Proof Bool
`at` (forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"m" (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"n" (SInteger -> SInteger -> SInteger
pet SInteger
m (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1)))
Hinted (TPProofRaw SBool)
-> ChainsTo (Hinted (TPProofRaw SBool))
-> ChainsTo (Hinted (TPProofRaw SBool))
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
2) (SInteger -> SInteger -> SInteger
pet SInteger
m (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
3) SInteger
2 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
2) (SInteger -> SInteger -> SInteger -> SInteger
ack (SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
2) SInteger
2) SInteger
2
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
ih Proof (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> IArgs (Forall "m" Integer -> Forall "n" Integer -> SBool)
-> Proof Bool
forall a. Instantiatable a => Proof a -> IArgs a -> Proof Bool
`at` (forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"m" SInteger
m, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"n" (SInteger
n SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1))
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SBool
sTrue
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: ChainsTo SBool
TPProofRaw SBool
forall a. TPProofRaw a
qed
]