{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeAbstractions #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wall -Werror #-}
module Documentation.SBV.Examples.TP.GCD where
import Prelude hiding (gcd)
import Data.SBV
import Data.SBV.TP
import Data.SBV.Tuple
#ifdef DOCTEST
#endif
nGCD :: SInteger -> SInteger -> SInteger
nGCD :: SInteger -> SInteger -> SInteger
nGCD = String
-> (SInteger -> SInteger -> SInteger)
-> SInteger
-> SInteger
-> SInteger
forall a.
(SMTDefinable a, Typeable a, Lambda Symbolic a) =>
String -> a -> a
smtFunction String
"nGCD" ((SInteger -> SInteger -> SInteger)
-> SInteger -> SInteger -> SInteger)
-> (SInteger -> SInteger -> SInteger)
-> SInteger
-> SInteger
-> SInteger
forall a b. (a -> b) -> a -> b
$ \SInteger
a SInteger
b -> SBool -> SInteger -> SInteger -> SInteger
forall a. Mergeable a => SBool -> a -> a -> a
ite (SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0) SInteger
a (SInteger -> SInteger -> SInteger
nGCD SInteger
b (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b))
gcd :: SInteger -> SInteger -> SInteger
gcd :: SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b = SInteger -> SInteger -> SInteger
nGCD (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a) (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b)
gcdNonNegative :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdNonNegative :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdNonNegative = do
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
nn <- String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> (MeasureArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer,
[ProofObj])
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool)
-> TP (Proof (Forall "a" Integer -> Forall "b" 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 "a" Integer -> Forall "b" Integer -> SBool),
Zero m, SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> (MeasureArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) m,
[ProofObj])
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
sInduct String
"nonNegativeNGCD"
(\(Forall SInteger
a) (Forall SInteger
b) -> SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
b SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.=> SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0)
(\SInteger
_a SInteger
b -> SInteger
b, []) ((Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih SInteger
a SInteger
b -> [SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0, SInteger
b 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)
|- [(SBool, TPProofRaw SBool)] -> TPProofRaw SBool
forall a. [(SBool, TPProofRaw a)] -> TPProofRaw a
cases [ SInteger
b 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
b 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)
==> SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b 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
nGCD SInteger
b (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b) 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 "a" Integer -> Forall "b" Integer -> SBool)
ih Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
b, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b))
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
]
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> [ProofObj]
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a.
Proposition a =>
String -> a -> [ProofObj] -> TP (Proof a)
lemma String
"nonNegative"
(\(Forall SInteger
a) (Forall SInteger
b) -> SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0)
[Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> ProofObj
forall a. Proof a -> ProofObj
proofOf Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
nn]
gcdZero :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdZero :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdZero = do
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
nGCDZero <-
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> (MeasureArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer,
[ProofObj])
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool)
-> TP (Proof (Forall "a" Integer -> Forall "b" 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 "a" Integer -> Forall "b" Integer -> SBool),
Zero m, SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> (MeasureArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) m,
[ProofObj])
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
sInduct String
"nGCDZero"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) -> SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
b SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.&& SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0 SBool -> SBool -> SBool
.=> SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0 SBool -> SBool -> SBool
.&& SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0)
(\SInteger
_a SInteger
b -> SInteger
b, []) ((Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih SInteger
a SInteger
b -> [SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0, SInteger
b 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
nGCD SInteger
a SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0 SBool -> SBool -> SBool
.=> SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0 SBool -> SBool -> SBool
.&& SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic 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
b 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
b 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
nGCD SInteger
b (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b) SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0 SBool -> SBool -> SBool
.=> SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0 SBool -> SBool -> SBool
.&& SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0)
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
b, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b))
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
]
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> [ProofObj]
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a.
Proposition a =>
String -> a -> [ProofObj] -> TP (Proof a)
lemma String
"gcdZero"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) -> SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0 SBool -> SBool -> SBool
.=> SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0 SBool -> SBool -> SBool
.&& SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0)
[Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> ProofObj
forall a. Proof a -> ProofObj
proofOf Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
nGCDZero]
commutative :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
commutative :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
commutative = do
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
nGCDComm <-
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall t.
(Proposition (Forall "a" Integer -> Forall "b" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"nGCDCommutative"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) -> SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
b SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.=> SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger
nGCD SInteger
b SInteger
a) (StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
a SInteger
b -> [SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0, SInteger
b 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
nGCD SInteger
a SInteger
b
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD SInteger
b SInteger
a
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
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall t.
(Proposition (Forall "a" Integer -> Forall "b" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"commutative"
(\(Forall SInteger
a) (Forall SInteger
b) -> SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger
gcd SInteger
b SInteger
a) (StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
a SInteger
b -> [] [SBool] -> TPProofRaw SInteger -> (SBool, TPProofRaw SInteger)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a) (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b)
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
nGCDComm Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b))
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
gcd SInteger
b SInteger
a
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
negGCD :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
negGCD :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
negGCD = String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> [ProofObj]
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a.
Proposition a =>
String -> a -> [ProofObj] -> TP (Proof a)
lemma String
"negGCD" (\(Forall SInteger
a) (Forall SInteger
b) -> let g :: SInteger
g = SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b in SInteger -> SInteger -> SInteger
gcd (-SInteger
a) SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
g SBool -> SBool -> SBool
.&& SInteger
g SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger
gcd SInteger
a (-SInteger
b)) []
zeroGCD :: TP (Proof (Forall "a" Integer -> SBool))
zeroGCD :: TP (Proof (Forall "a" Integer -> SBool))
zeroGCD = String
-> (Forall "a" Integer -> SBool)
-> [ProofObj]
-> TP (Proof (Forall "a" Integer -> SBool))
forall a.
Proposition a =>
String -> a -> [ProofObj] -> TP (Proof a)
lemma String
"negGCD" (\(Forall SInteger
a) -> SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
0 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger
gcd SInteger
0 SInteger
a SBool -> SBool -> SBool
.&& SInteger -> SInteger -> SInteger
gcd SInteger
0 SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a SBool -> SBool -> SBool
.&& SInteger -> SInteger -> SInteger
gcd SInteger
0 SInteger
0 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0) []
isEven :: SInteger -> SBool
isEven :: SInteger -> SBool
isEven = (Integer
2 Integer -> SInteger -> SBool
`sDivides`)
isOdd :: SInteger -> SBool
isOdd :: SInteger -> SBool
isOdd = SBool -> SBool
sNot (SBool -> SBool) -> (SInteger -> SBool) -> SInteger -> SBool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SInteger -> SBool
isEven
dvd :: SInteger -> SInteger -> SBool
SInteger
a dvd :: SInteger -> SInteger -> SBool
`dvd` SInteger
b = SBool -> SBool -> SBool -> SBool
forall a. Mergeable a => SBool -> a -> a -> a
ite (SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0) (SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0) (SInteger
b SInteger -> SInteger -> SInteger
`sEMod` SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0)
dvdAbs :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
dvdAbs :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
dvdAbs = do
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
l2r <- SMTConfig
-> String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall t.
(Proposition (Forall "a" Integer -> Forall "b" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
SMTConfig
-> String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
SMTConfig -> String -> a -> StepArgs a t -> TP (Proof a)
calcWith SMTConfig
cvc5 String
"dvdAbs_l2r"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) -> SInteger
a SInteger -> SInteger -> SBool
`dvd` SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b SBool -> SBool -> SBool
.=> SInteger
a SInteger -> SInteger -> SBool
`dvd` SInteger
b) (StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
a SInteger
b -> [SInteger
a SInteger -> SInteger -> SBool
`dvd` SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b]
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- [(SBool, TPProofRaw SBool)] -> TPProofRaw SBool
forall a. [(SBool, TPProofRaw a)] -> TPProofRaw a
cases [ SInteger
b 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)
==> 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
b 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)
==> 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
]
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
r2l <- SMTConfig
-> String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall t.
(Proposition (Forall "a" Integer -> Forall "b" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
SMTConfig
-> String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
SMTConfig -> String -> a -> StepArgs a t -> TP (Proof a)
calcWith SMTConfig
cvc5 String
"dvdAbs_r2l"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) -> SInteger
a SInteger -> SInteger -> SBool
`dvd` SInteger
b SBool -> SBool -> SBool
.=> SInteger
a SInteger -> SInteger -> SBool
`dvd` SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b) (StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
a SInteger
b -> [SInteger
a SInteger -> SInteger -> SBool
`dvd` SInteger
b]
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- [(SBool, TPProofRaw SBool)] -> TPProofRaw SBool
forall a. [(SBool, TPProofRaw a)] -> TPProofRaw a
cases [ SInteger
b 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)
==> 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
b 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)
==> 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
]
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> [ProofObj]
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a.
Proposition a =>
String -> a -> [ProofObj] -> TP (Proof a)
lemma String
"dvdAbs"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) -> SInteger
a SInteger -> SInteger -> SBool
`dvd` SInteger
b SBool -> SBool -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
a SInteger -> SInteger -> SBool
`dvd` SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b)
[Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> ProofObj
forall a. Proof a -> ProofObj
proofOf Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
l2r, Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> ProofObj
forall a. Proof a -> ProofObj
proofOf Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
r2l]
dvdMul :: TP (Proof (Forall "d" Integer -> Forall "a" Integer -> Forall "k" Integer -> SBool))
dvdMul :: TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool))
dvdMul = String
-> (Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool)
-> StepArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool))
forall t.
(Proposition
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool)
-> StepArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool)
t
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"dvdMul"
(\(Forall SInteger
d) (Forall SInteger
a) (Forall SInteger
k) -> SInteger
d SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.=> SInteger
d SInteger -> SInteger -> SBool
`dvd` (SInteger
kSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a)) (StepArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool)))
-> StepArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
d SInteger
a SInteger
k -> [SInteger
d SInteger -> SInteger -> SBool
`dvd` SInteger
a]
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- [(SBool, TPProofRaw SBool)] -> TPProofRaw SBool
forall a. [(SBool, TPProofRaw a)] -> TPProofRaw a
cases [ SInteger
d 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)
==> SInteger
d SInteger -> SInteger -> SBool
`dvd` (SInteger
kSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a)
SBool -> SBool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0
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
d 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)
==> SInteger
d SInteger -> SInteger -> SBool
`dvd` (SInteger
kSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a)
SBool -> SBool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
d SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
a SInteger -> SInteger -> SInteger
`sEDiv` SInteger
d
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
d SInteger -> SInteger -> SBool
`dvd` (SInteger
k SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
d SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
a SInteger -> SInteger -> SInteger
`sEDiv` SInteger
d)
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
]
dvdOddThenOdd :: TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
dvdOddThenOdd :: TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
dvdOddThenOdd = String
-> (Forall "d" Integer -> Forall "a" Integer -> SBool)
-> StepArgs
(Forall "d" Integer -> Forall "a" Integer -> SBool) Bool
-> TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
forall t.
(Proposition (Forall "d" Integer -> Forall "a" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "d" Integer -> Forall "a" Integer -> SBool)
-> StepArgs (Forall "d" Integer -> Forall "a" Integer -> SBool) t
-> TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"dvdOddThenOdd"
(\(Forall SInteger
d) (Forall SInteger
a) -> SInteger
d SInteger -> SInteger -> SBool
`dvd` (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1) SBool -> SBool -> SBool
.=> SInteger -> SBool
isOdd SInteger
d) (StepArgs (Forall "d" Integer -> Forall "a" Integer -> SBool) Bool
-> TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool)))
-> StepArgs
(Forall "d" Integer -> Forall "a" Integer -> SBool) Bool
-> TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
d SInteger
a -> [SInteger
d SInteger -> SInteger -> SBool
`dvd` (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1)]
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- [(SBool, TPProofRaw SBool)] -> TPProofRaw SBool
forall a. [(SBool, TPProofRaw a)] -> TPProofRaw a
cases [ SInteger -> SBool
isOdd SInteger
d SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> TPProofRaw SBool
forall a. Trivial a => a
trivial
, SInteger -> SBool
isEven SInteger
d SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> (SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* (SInteger
d SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2)) SInteger -> SInteger -> SBool
`dvd` (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1)
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
2 SInteger -> SInteger -> SBool
`dvd` (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1)
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: ChainsTo SBool
TPProofRaw SBool
forall a. Contradiction a => a
contradiction
]
dvdEvenWhenOdd :: TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
dvdEvenWhenOdd :: TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
dvdEvenWhenOdd = String
-> (Forall "d" Integer -> Forall "a" Integer -> SBool)
-> StepArgs
(Forall "d" Integer -> Forall "a" Integer -> SBool) Bool
-> TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
forall t.
(Proposition (Forall "d" Integer -> Forall "a" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "d" Integer -> Forall "a" Integer -> SBool)
-> StepArgs (Forall "d" Integer -> Forall "a" Integer -> SBool) t
-> TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"dvdEvenWhenOdd"
(\(Forall SInteger
d) (Forall SInteger
a) -> SInteger -> SBool
isOdd SInteger
d SBool -> SBool -> SBool
.&& SInteger
d SInteger -> SInteger -> SBool
`dvd` (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a) SBool -> SBool -> SBool
.=> SInteger
d SInteger -> SInteger -> SBool
`dvd` SInteger
a) (StepArgs (Forall "d" Integer -> Forall "a" Integer -> SBool) Bool
-> TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool)))
-> StepArgs
(Forall "d" Integer -> Forall "a" Integer -> SBool) Bool
-> TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
d SInteger
a -> [SInteger -> SBool
isOdd SInteger
d, SInteger
d SInteger -> SInteger -> SBool
`dvd` (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a)]
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- let t :: SInteger
t = (SInteger
d SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
1) SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2
m :: SInteger
m = (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a) SInteger -> SInteger -> SInteger
`sEDiv` SInteger
d
in SBool
sTrue
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
d SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
t SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
1 SBool -> SBool -> SBool
.&& SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
dSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
m
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
tSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1) SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
m
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
tSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
m SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
m SBool -> SBool -> SBool
.&& SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*(SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
-SInteger
tSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
m) SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
m
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: Integer
2 Integer -> SInteger -> SBool
`sDivides` SInteger
m
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: let n :: SInteger
n = SInteger
m SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2
in SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
d SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* (SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
n) SBool -> SBool -> SBool
.&& SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* (SInteger
d SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
n)
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
d SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
n
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
d SInteger -> SInteger -> SBool
`dvd` SInteger
a
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
dvdSum1 :: TP (Proof (Forall "d" Integer -> Forall "a" Integer -> Forall "b" Integer -> SBool))
dvdSum1 :: TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool))
dvdSum1 =
String
-> (Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool))
forall t.
(Proposition
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
t
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"dvdSum1"
(\(Forall SInteger
d) (Forall SInteger
a) (Forall SInteger
b) -> SInteger
d SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger
d SInteger -> SInteger -> SBool
`dvd` SInteger
b SBool -> SBool -> SBool
.=> SInteger
d SInteger -> SInteger -> SBool
`dvd` (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
b)) (StepArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> StepArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
d SInteger
a SInteger
b -> [SInteger
d SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger
d SInteger -> SInteger -> SBool
`dvd` SInteger
b]
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- [(SBool, TPProofRaw SBool)] -> TPProofRaw SBool
forall a. [(SBool, TPProofRaw a)] -> TPProofRaw a
cases [ SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0 SBool -> SBool -> SBool
.|| SInteger
b 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
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
b 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)
==> SInteger
d SInteger -> SInteger -> SBool
`dvd` (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
b)
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
d SInteger -> SInteger -> SBool
`dvd` (SInteger
a SInteger -> SInteger -> SInteger
`sEDiv` SInteger
d SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
d SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
d SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
d)
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
d SInteger -> SInteger -> SBool
`dvd` (SInteger
d SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* (SInteger
a SInteger -> SInteger -> SInteger
`sEDiv` SInteger
d SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
d))
SBool -> ChainsTo SBool -> ChainsTo 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
]
dvdSum2 :: TP (Proof (Forall "d" Integer -> Forall "a" Integer -> Forall "b" Integer -> SBool))
dvdSum2 :: TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool))
dvdSum2 =
String
-> (Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
Integer
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool))
forall t.
(Proposition
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
t
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"dvdSum2"
(\(Forall SInteger
d) (Forall SInteger
a) (Forall SInteger
b) -> SInteger
d SInteger -> SInteger -> SBool
`dvd` (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
b) SBool -> SBool -> SBool
.&& SInteger
d SInteger -> SInteger -> SBool
`dvd` SInteger
b SBool -> SBool -> SBool
.=> SInteger
d SInteger -> SInteger -> SBool
`dvd` SInteger
a) (StepArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
Integer
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> StepArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
Integer
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
d SInteger
a SInteger
b -> [SInteger
d SInteger -> SInteger -> SBool
`dvd` (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
b) SBool -> SBool -> SBool
.&& SInteger
d SInteger -> SInteger -> SBool
`dvd` SInteger
b]
[SBool] -> TPProofRaw SInteger -> (SBool, TPProofRaw SInteger)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- [(SBool, TPProofRaw SInteger)] -> TPProofRaw SInteger
forall a. [(SBool, TPProofRaw a)] -> TPProofRaw a
cases [ SInteger
d 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
d 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)
==> let k1 :: SInteger
k1 = (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
b) SInteger -> SInteger -> SInteger
`sEDiv` SInteger
d
k2 :: SInteger
k2 = SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
d
in SInteger
a SInteger -> SInteger -> SInteger
`sEDiv` SInteger
d
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
b SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
b) SInteger -> SInteger -> SInteger
`sEDiv` SInteger
d
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: (SInteger
k1 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
d SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
k2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
d) SInteger -> SInteger -> SInteger
`sEDiv` SInteger
d
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: (SInteger
k1 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
k2) SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
d SInteger -> SInteger -> SInteger
`sEDiv` SInteger
d
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
]
gcdDivides :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdDivides :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdDivides = do
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
dAbs <- String
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"dvdAbs" TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
dvdAbs
Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
helper <- String
-> (Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall t.
(Proposition
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
t
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"helper"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) (Forall @"x" SInteger
x) ->
SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
b SBool -> SBool -> SBool
.&& SInteger
x SInteger -> SInteger -> SBool
`dvd` (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b)
SBool -> SBool -> SBool
.=>
SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
a
) (StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)))
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
a SInteger
b SInteger
x -> [SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SInteger
0, SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
b, SInteger
x SInteger -> SInteger -> SBool
`dvd` (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b)]
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
a
SBool -> SBool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? SInteger
a SInteger -> SInteger -> SInteger
`sEDiv` SInteger
x SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== (SInteger
a SInteger -> SInteger -> SInteger
`sEDiv` SInteger
b) SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* (SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
x) SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b) SInteger -> SInteger -> SInteger
`sEDiv` SInteger
x
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
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
dNGCD <- String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> (MeasureArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer,
[ProofObj])
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool)
-> TP (Proof (Forall "a" Integer -> Forall "b" 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 "a" Integer -> Forall "b" Integer -> SBool),
Zero m, SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> (MeasureArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) m,
[ProofObj])
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
sInduct String
"dvdNGCD"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) -> SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
b SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.=> SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b SInteger -> SInteger -> SBool
`dvd` SInteger
b)
(\SInteger
_a SInteger
b -> SInteger
b, []) ((Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih SInteger
a SInteger
b -> [SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0, SInteger
b 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)
|- let g :: SInteger
g = SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b
in SInteger
g SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger
g SInteger -> SInteger -> SBool
`dvd` SInteger
b
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
b 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
b 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)
==> let g' :: SInteger
g' = SInteger -> SInteger -> SInteger
nGCD SInteger
b (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b)
in SInteger
g' SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger
g' SInteger -> SInteger -> SBool
`dvd` SInteger
b
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
b, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b))
TPProofRaw SBool
-> Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> Hinted (TPProofRaw SBool)
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
helper
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
]
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> [ProofObj]
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a.
Proposition a =>
String -> a -> [ProofObj] -> TP (Proof a)
lemmaString
"gcdDivides"
(\(Forall SInteger
a) (Forall SInteger
b) -> SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b SInteger -> SInteger -> SBool
`dvd` SInteger
b)
[Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> ProofObj
forall a. Proof a -> ProofObj
proofOf Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
dAbs, Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> ProofObj
forall a. Proof a -> ProofObj
proofOf Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
dNGCD]
gcdMaximal :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> Forall "x" Integer -> SBool))
gcdMaximal :: TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
gcdMaximal = do
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
dAbs <- String
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"dvdAbs" TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
dvdAbs
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
comm <- String
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"gcdComm" TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
commutative
Proof (Forall "x" Integer -> Forall "y" Integer -> SBool)
eDiv <- String
-> (Forall "x" Integer -> Forall "y" Integer -> SBool)
-> [ProofObj]
-> TP (Proof (Forall "x" Integer -> Forall "y" Integer -> SBool))
forall a.
Proposition a =>
String -> a -> [ProofObj] -> TP (Proof a)
lemma String
"eDiv"
(\(Forall @"x" SInteger
x) (Forall @"y" SInteger
y) -> SInteger
y SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SInteger
0 SBool -> SBool -> SBool
.=> SInteger
x SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== (SInteger
x SInteger -> SInteger -> SInteger
`sEDiv` SInteger
y) SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
y SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
x SInteger -> SInteger -> SInteger
`sEMod` SInteger
y)
[]
Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
helper <- String
-> (Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall t.
(Proposition
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
t
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"helper"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) (Forall @"x" SInteger
x) ->
SInteger
x SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
b
SBool -> SBool -> SBool
.=>
SInteger
x SInteger -> SInteger -> SBool
`dvd` (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b)
) (StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)))
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
a SInteger
b SInteger
x -> [SInteger
x SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SInteger
0, SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SInteger
0, SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
a, SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
b]
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- SInteger
x SInteger -> SInteger -> SBool
`dvd` (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b)
SBool -> String -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? String
"x `dvd` a && x `dvd` b"
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: let k1 :: SInteger
k1 = SInteger
a SInteger -> SInteger -> SInteger
forall a. SDivisible a => a -> a -> a
`sDiv` SInteger
x
k2 :: SInteger
k2 = SInteger
b SInteger -> SInteger -> SInteger
forall a. SDivisible a => a -> a -> a
`sDiv` SInteger
x
in SInteger
x SInteger -> SInteger -> SBool
`dvd` ((SInteger
k1SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
x) SInteger -> SInteger -> SInteger
`sEMod` (SInteger
k2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
x))
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "x" Integer -> Forall "y" Integer -> SBool)
eDiv Proof (Forall "x" Integer -> Forall "y" Integer -> SBool)
-> IArgs (Forall "x" Integer -> Forall "y" 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 @"x" (SInteger
k1SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
x), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"y" (SInteger
k2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
x))
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
x SInteger -> SInteger -> SBool
`dvd` ((SInteger
k1SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
x) SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- ((SInteger
k1SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
x) SInteger -> SInteger -> SInteger
`sEDiv` (SInteger
k2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
x)) SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* (SInteger
k2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
x))
SBool -> ChainsTo SBool -> ChainsTo 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
Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
mNGCD <- String
-> (Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> (MeasureArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Integer,
[ProofObj])
-> (Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool)
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" 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 "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool),
Zero m, SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> (MeasureArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
m,
[ProofObj])
-> (Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
t)
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
sInduct String
"mNGCD"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) (Forall @"x" SInteger
x) ->
SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
b SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
b SBool -> SBool -> SBool
.=> SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b)
(\SInteger
_a SInteger
b SInteger
_x -> SInteger
b, []) ((Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool)
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)))
-> (Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool)
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
ih SInteger
a SInteger
b SInteger
x -> let g :: SInteger
g = SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b
in [SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0, SInteger
b SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0, SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
b]
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
g
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
b 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
b 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
x SInteger -> SInteger -> SBool
`dvd` SInteger -> SInteger -> SInteger
nGCD SInteger
b (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b)
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
ih Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> IArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" 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 @"a" SInteger
b, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"x" SInteger
x)
TPProofRaw SBool
-> Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> Hinted (TPProofRaw SBool)
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
helper
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
]
String
-> (Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall t.
(Proposition
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
t
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"gcdMaximal"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) (Forall @"x" SInteger
x) -> SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
b SBool -> SBool -> SBool
.=> SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b) (StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)))
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
a SInteger
b SInteger
x -> [SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
a, SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
b]
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b
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 -> SInteger
forall a. Num a => a -> a
abs SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger -> SInteger -> SInteger
nGCD (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a) (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b)
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
mNGCD Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> IArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" 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 @"a" (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"x" SInteger
x)
TPProofRaw SBool -> Proof Bool -> Hinted (TPProofRaw SBool)
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
dAbs Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
x, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
a)
Hinted (TPProofRaw SBool)
-> Proof Bool -> Hinted (Hinted (TPProofRaw SBool))
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
dAbs Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
x, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b)
Hinted (Hinted (TPProofRaw SBool))
-> ChainsTo (Hinted (Hinted (TPProofRaw SBool)))
-> ChainsTo (Hinted (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
, SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.< SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b SBool -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
comm Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
a, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger -> SInteger -> SInteger
gcd SInteger
b SInteger
a
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger -> SInteger -> SInteger
nGCD (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b) (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a)
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
mNGCD Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> IArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" 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 @"a" (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"x" SInteger
x)
TPProofRaw SBool -> Proof Bool -> Hinted (TPProofRaw SBool)
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
dAbs Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
x, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
a)
Hinted (TPProofRaw SBool)
-> Proof Bool -> Hinted (Hinted (TPProofRaw SBool))
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
dAbs Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
x, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b)
Hinted (Hinted (TPProofRaw SBool))
-> ChainsTo (Hinted (Hinted (TPProofRaw SBool)))
-> ChainsTo (Hinted (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
]
gcdCorrect :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdCorrect :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdCorrect = do
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
divides <- String
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"gcdDivides" TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdDivides
Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
maximal <- String
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"gcdMaximal" TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
gcdMaximal
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall t.
(Proposition (Forall "a" Integer -> Forall "b" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"gcdCorrect"
(\(Forall SInteger
a) (Forall SInteger
b) ->
let g :: SInteger
g = SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b
in SInteger
g SInteger -> SInteger -> SBool
`dvd` SInteger
a
SBool -> SBool -> SBool
.&& SInteger
g SInteger -> SInteger -> SBool
`dvd` SInteger
b
SBool -> SBool -> SBool
.&& (Forall Any Integer -> SBool) -> SBool
forall a. QuantifiedBool a => a -> SBool
quantifiedBool (\(Forall SInteger
x) -> SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
b SBool -> SBool -> SBool
.=> SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
g)
) (StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
a SInteger
b -> []
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- let g :: SInteger
g = SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b
m :: SBool
m = (Forall Any Integer -> SBool) -> SBool
forall a. QuantifiedBool a => a -> SBool
quantifiedBool (\(Forall SInteger
x) -> SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
b SBool -> SBool -> SBool
.=> SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
g)
in SInteger
g SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger
g SInteger -> SInteger -> SBool
`dvd` SInteger
b SBool -> SBool -> SBool
.&& SBool
m
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
divides Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
a, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SBool
m
SBool
-> Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
maximal
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
gcdLargest :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> Forall "x" Integer -> SBool))
gcdLargest :: TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
gcdLargest = do
Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
maximal <- String
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"gcdMaximal" TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
gcdMaximal
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
zero <- String
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"gcdZero" TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdZero
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
nn <- String
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"gcdNonNegative" TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdNonNegative
String
-> (Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall t.
(Proposition
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
t
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"gcdLargest"
(\(Forall SInteger
a) (Forall SInteger
b) (Forall SInteger
x) -> (SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SInteger
0 SBool -> SBool -> SBool
.|| SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SInteger
0) SBool -> SBool -> SBool
.&& SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
b SBool -> SBool -> SBool
.=> SInteger
x SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.<= SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b) (StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)))
-> StepArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
Bool
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
a SInteger
b SInteger
x -> [(SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SInteger
0 SBool -> SBool -> SBool
.|| SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SInteger
0) SBool -> SBool -> SBool
.&& SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
a, SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger
b]
[SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- SInteger
x SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.<= SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
maximal Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> IArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" 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 @"a" SInteger
a, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"x" SInteger
x)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: (SInteger
x SInteger -> SInteger -> SBool
`dvd` SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b SBool -> SBool -> SBool
.=> SInteger
x SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.<= SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b)
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
zero Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
a, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b)
TPProofRaw SBool -> Proof Bool -> Hinted (TPProofRaw SBool)
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
nn Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
a, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b)
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
gcdAdd :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdAdd :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdAdd = do
Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
dSum1 <- String
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"dvdSum1" TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool))
dvdSum1
Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
dSum2 <- String
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"dvdSum2" TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool))
dvdSum2
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
divides <- String
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"gcdDivides" TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdDivides
Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
largest <- String
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"gcdLargest" TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
gcdLargest
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall t.
(Proposition (Forall "a" Integer -> Forall "b" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"gcdAdd"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) -> SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger
gcd (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
b) SInteger
b) (StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
a SInteger
b -> [] [SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
|-> let g1 :: SInteger
g1 = SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b
g2 :: SInteger
g2 = SInteger -> SInteger -> SInteger
gcd (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
b) SInteger
b
in SBool
sTrue
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
divides Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
a, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
g1 SInteger -> SInteger -> SBool
`dvd` SInteger
a SBool -> SBool -> SBool
.&& SInteger
g1 SInteger -> SInteger -> SBool
`dvd` SInteger
b
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
divides Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
b), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
g2 SInteger -> SInteger -> SBool
`dvd` (SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
b) SBool -> SBool -> SBool
.&& SInteger
g2 SInteger -> SInteger -> SBool
`dvd` SInteger
b
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
dSum1 Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" 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 @"d" SInteger
g1, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"a" SInteger
a, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
g1 SInteger -> SInteger -> SBool
`dvd` (SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
b)
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
dSum2 Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "b" 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 @"d" SInteger
g2, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"a" SInteger
a, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
g2 SInteger -> SInteger -> SBool
`dvd` SInteger
a
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
largest Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> IArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" 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 @"a" SInteger
a, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"x" SInteger
g2)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
g1 SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
g2
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
largest Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> IArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" 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 @"a" (SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
b), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"x" SInteger
g1)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
g2 SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
g1
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
g1 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
g2
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
gcdEvenEven :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdEvenEven :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdEvenEven = do
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
modEE <- String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> [ProofObj]
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a.
Proposition a =>
String -> a -> [ProofObj] -> TP (Proof a)
lemma String
"modEE"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) -> SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SInteger
0 SBool -> SBool -> SBool
.=> (SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
a) SInteger -> SInteger -> SInteger
`sEMod` (SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
b) SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b))
[]
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
nGCDEvenEven <- String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> (MeasureArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer,
[ProofObj])
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer)
-> TP (Proof (Forall "a" Integer -> Forall "b" 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 "a" Integer -> Forall "b" Integer -> SBool),
Zero m, SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> (MeasureArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) m,
[ProofObj])
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
sInduct String
"nGCDEvenEven"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) -> SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
b SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.=> SInteger -> SInteger -> SInteger
nGCD (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a) (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
b) SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b)
(\SInteger
_a SInteger
b -> SInteger
b, []) ((Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih SInteger
a SInteger
b -> [SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0, SInteger
b 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
nGCD (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a) (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
b)
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
b 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
b 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)
==> SInteger -> SInteger -> SInteger
nGCD (SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
a) (SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
b)
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD (SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
b) ((SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
a) SInteger -> SInteger -> SInteger
`sEMod` (SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
b))
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
modEE Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
a, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b)
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD (SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
b) (SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* (SInteger
a SInteger -> SInteger -> SInteger
`sEMod` SInteger
b))
SInteger
-> Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b
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
]
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall t.
(Proposition (Forall "a" Integer -> Forall "b" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"gcdEvenEven"
(\(Forall SInteger
a) (Forall SInteger
b) -> SInteger -> SInteger -> SInteger
gcd (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a) (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
b) SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b) (StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
a SInteger
b -> [] [SBool] -> TPProofRaw SInteger -> (SBool, TPProofRaw SInteger)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- SInteger -> SInteger -> SInteger
gcd (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a) (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
b)
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD (SInteger -> SInteger
forall a. Num a => a -> a
abs (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
a)) (SInteger -> SInteger
forall a. Num a => a -> a
abs (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
b))
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD (SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a) (SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b)
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
nGCDEvenEven Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b))
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger -> SInteger -> SInteger
nGCD (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a) (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b)
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b
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
gcdOddEven :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdOddEven :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdOddEven = do
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
divides <- String
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"gcdDivides" TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdDivides
Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
largest <- String
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
-> TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"gcdLargest" TP
(Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool))
gcdLargest
Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool)
dMul <- String
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool))
-> TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"dvdMul" TP
(Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool))
dvdMul
Proof (Forall "d" Integer -> Forall "a" Integer -> SBool)
dOddThenOdd <- String
-> TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
-> TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"dvdOddThenOdd" TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
dvdOddThenOdd
Proof (Forall "d" Integer -> Forall "a" Integer -> SBool)
dEvenWhenOdd <- String
-> TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
-> TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"dvdEvenWhenOdd" TP (Proof (Forall "d" Integer -> Forall "a" Integer -> SBool))
dvdEvenWhenOdd
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall t.
(Proposition (Forall "a" Integer -> Forall "b" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
String -> a -> StepArgs a t -> TP (Proof a)
calc String
"gcdOddEven"
(\(Forall SInteger
a) (Forall SInteger
b) -> SInteger -> SInteger -> SInteger
gcd (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1) (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
b) SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger
gcd (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1) SInteger
b) (StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Bool
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
a SInteger
b -> [] [SBool] -> TPProofRaw SBool -> (SBool, TPProofRaw SBool)
|-> let g1 :: SInteger
g1 = SInteger -> SInteger -> SInteger
gcd (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1) (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
b)
g2 :: SInteger
g2 = SInteger -> SInteger -> SInteger
gcd (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1) SInteger
b
in SBool
sTrue
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
divides Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
b))
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
g1 SInteger -> SInteger -> SBool
`dvd` (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1) SBool -> SBool -> SBool
.&& SInteger
g1 SInteger -> SInteger -> SBool
`dvd` (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
b)
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
divides Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
g2 SInteger -> SInteger -> SBool
`dvd` (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1) SBool -> SBool -> SBool
.&& SInteger
g2 SInteger -> SInteger -> SBool
`dvd` SInteger
b
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool)
dMul Proof
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" Integer -> SBool)
-> IArgs
(Forall "d" Integer
-> Forall "a" Integer -> Forall "k" 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 @"d" SInteger
g2, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"a" SInteger
b, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"k" SInteger
2)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
g2 SInteger -> SInteger -> SBool
`dvd` (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
b)
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "d" Integer -> Forall "a" Integer -> SBool)
dOddThenOdd Proof (Forall "d" Integer -> Forall "a" Integer -> SBool)
-> IArgs (Forall "d" 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 @"d" SInteger
g1, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"a" SInteger
a)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SBool
isOdd SInteger
g1
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "d" Integer -> Forall "a" Integer -> SBool)
dEvenWhenOdd Proof (Forall "d" Integer -> Forall "a" Integer -> SBool)
-> IArgs (Forall "d" 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 @"d" SInteger
g1, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"a" SInteger
b)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
g1 SInteger -> SInteger -> SBool
`dvd` SInteger
b
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
largest Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> IArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" 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 @"a" (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
b), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"x" SInteger
g2)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
g1 SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
g2
SBool -> Proof Bool -> Hinted SBool
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
largest Proof
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" Integer -> SBool)
-> IArgs
(Forall "a" Integer
-> Forall "b" Integer -> Forall "x" 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 @"a" (SInteger
2SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
*SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+SInteger
1), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"x" SInteger
g1)
TPProofRaw SBool
-> ChainsTo (TPProofRaw SBool) -> ChainsTo (TPProofRaw SBool)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
g2 SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
g1
SBool -> ChainsTo SBool -> ChainsTo SBool
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
g1 SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
g2
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
nGCDSub :: SInteger -> SInteger -> SInteger
nGCDSub :: SInteger -> SInteger -> SInteger
nGCDSub = String
-> (SInteger -> SInteger -> SInteger)
-> SInteger
-> SInteger
-> SInteger
forall a.
(SMTDefinable a, Typeable a, Lambda Symbolic a) =>
String -> a -> a
smtFunction String
"nGCDSub" ((SInteger -> SInteger -> SInteger)
-> SInteger -> SInteger -> SInteger)
-> (SInteger -> SInteger -> SInteger)
-> SInteger
-> SInteger
-> SInteger
forall a b. (a -> b) -> a -> b
$ \SInteger
a SInteger
b -> SBool -> SInteger -> SInteger -> SInteger
forall a. Mergeable a => SBool -> a -> a -> a
ite (SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
b) 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
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0) SInteger
b
(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
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0) 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
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
b) (SInteger -> SInteger -> SInteger
nGCDSub (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
b) SInteger
b)
(SInteger -> SInteger -> SInteger
nGCDSub SInteger
a (SInteger
b SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
a))
gcdSub :: SInteger -> SInteger -> SInteger
gcdSub :: SInteger -> SInteger -> SInteger
gcdSub SInteger
a SInteger
b = SInteger -> SInteger -> SInteger
nGCDSub (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a) (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b)
gcdSubEquiv :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdSubEquiv :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdSubEquiv = do
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
comm <- String
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"commutative" TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
commutative
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
addG <- String
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"gcdAdd" TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdAdd
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
nEq <- String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> (MeasureArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer,
[ProofObj])
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer)
-> TP (Proof (Forall "a" Integer -> Forall "b" 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 "a" Integer -> Forall "b" Integer -> SBool),
Zero m, SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> (MeasureArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) m,
[ProofObj])
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
sInduct String
"nGCDSubEquiv"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) -> SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
b SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.=> SInteger -> SInteger -> SInteger
nGCDSub SInteger
a SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b)
(\SInteger
a SInteger
b -> SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
b, []) ((Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih SInteger
a SInteger
b -> [SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0, SInteger
b 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
nGCDSub SInteger
a SInteger
b
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
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
b SBool -> TPProofRaw SInteger -> (SBool, TPProofRaw SInteger)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b 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
, SInteger
a 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)
==> SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b 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
, SInteger
b 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)
==> SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b 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
, SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
b SBool -> SBool -> SBool
.&& SInteger
b 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)
==> SInteger -> SInteger -> SInteger
nGCDSub (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
b) SInteger
b
SInteger
-> Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
b) SInteger
b
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
addG Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
b), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b)
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b
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
, SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.< SInteger
b SBool -> SBool -> SBool
.&& SInteger
a 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)
==> SInteger -> SInteger -> SInteger
nGCDSub SInteger
a (SInteger
b SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
a)
SInteger
-> Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD SInteger
a (SInteger
b SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
a)
SInteger
-> Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
comm
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD (SInteger
b SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
a) SInteger
a
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
addG Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" (SInteger
b SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
a), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
a)
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD SInteger
b SInteger
a
SInteger
-> Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
comm
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b
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
]
SMTConfig
-> String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall t.
(Proposition (Forall "a" Integer -> Forall "b" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
SMTConfig
-> String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
SMTConfig -> String -> a -> StepArgs a t -> TP (Proof a)
calcWith SMTConfig
cvc5 String
"gcdSubEquiv"
(\(Forall SInteger
a) (Forall SInteger
b) -> SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger
gcdSub SInteger
a SInteger
b) (StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
a SInteger
b -> [] [SBool] -> TPProofRaw SInteger -> (SBool, TPProofRaw SInteger)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a) (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b)
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
nEq Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b))
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCDSub (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a) (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b)
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
gcdSub SInteger
a SInteger
b
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
nGCDBin :: SInteger -> SInteger -> SInteger
nGCDBin :: SInteger -> SInteger -> SInteger
nGCDBin = String
-> (SInteger -> SInteger -> SInteger)
-> SInteger
-> SInteger
-> SInteger
forall a.
(SMTDefinable a, Typeable a, Lambda Symbolic a) =>
String -> a -> a
smtFunction String
"nGCDBin" ((SInteger -> SInteger -> SInteger)
-> SInteger -> SInteger -> SInteger)
-> (SInteger -> SInteger -> SInteger)
-> SInteger
-> SInteger
-> SInteger
forall a b. (a -> b) -> a -> b
$ \SInteger
a SInteger
b -> SBool -> SInteger -> SInteger -> SInteger
forall a. Mergeable a => SBool -> a -> a -> a
ite (SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0) SInteger
b
(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
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
0) 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 -> SBool
isEven SInteger
a SBool -> SBool -> SBool
.&& SInteger -> SBool
isEven SInteger
b) (SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger -> SInteger -> SInteger
nGCDBin (SInteger
a SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2) (SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2))
(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 -> SBool
isOdd SInteger
a SBool -> SBool -> SBool
.&& SInteger -> SBool
isEven SInteger
b) ( SInteger -> SInteger -> SInteger
nGCDBin SInteger
a (SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2))
(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
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.<= SInteger
b) ( SInteger -> SInteger -> SInteger
nGCDBin SInteger
a (SInteger
b SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
a))
( SInteger -> SInteger -> SInteger
nGCDBin (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
b) SInteger
b)
gcdBin :: SInteger -> SInteger -> SInteger
gcdBin :: SInteger -> SInteger -> SInteger
gcdBin SInteger
a SInteger
b = SInteger -> SInteger -> SInteger
nGCDBin (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a) (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b)
gcdBinEquiv :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdBinEquiv :: TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdBinEquiv = do
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
gEvenEven <- String
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"gcdEvenEven" TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdEvenEven
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
gOddEven <- String
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"gcdOddEven" TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdOddEven
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
gAdd <- String
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"gcdAdd" TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
gcdAdd
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
comm <- String
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a. String -> TP (Proof a) -> TP (Proof a)
recall String
"commutative" TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
commutative
Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
nEq <- String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> (MeasureArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool)
(Integer, Integer),
[ProofObj])
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer)
-> TP (Proof (Forall "a" Integer -> Forall "b" 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 "a" Integer -> Forall "b" Integer -> SBool),
Zero m, SymVal t, EqSymbolic (SBV t)) =>
String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> (MeasureArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) m,
[ProofObj])
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
sInduct String
"nGCDBinEquiv"
(\(Forall @"a" SInteger
a) (Forall @"b" SInteger
b) -> SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
b SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0 SBool -> SBool -> SBool
.=> SInteger -> SInteger -> SInteger
nGCDBin SInteger
a SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b)
(\SInteger
a SInteger
b -> (SInteger, SInteger) -> SBV (Integer, Integer)
forall tup a. Tuple tup a => a -> SBV tup
tuple (SInteger
a, SInteger
b), []) ((Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer)
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih SInteger
a SInteger
b -> [SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.>= SInteger
0, SInteger
b 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
nGCDBin SInteger
a SInteger
b
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
a 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
b 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 -> SBool
isEven SInteger
a SBool -> SBool -> SBool
.&& SInteger -> SBool
isEven SInteger
b SBool -> TPProofRaw SInteger -> (SBool, TPProofRaw SInteger)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger -> SInteger -> SInteger
nGCDBin (SInteger
a SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2) (SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2)
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" (SInteger
a SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2))
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger -> SInteger -> SInteger
nGCD (SInteger
a SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2) (SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2)
SInteger -> SBool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
a SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2
TPProofRaw SInteger -> SBool -> Hinted (TPProofRaw SInteger)
forall a b. HintsTo a b => a -> b -> Hinted a
?? SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2
Hinted (TPProofRaw SInteger)
-> Proof Bool -> Hinted (Hinted (TPProofRaw SInteger))
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
gEvenEven Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" (SInteger
a SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2))
Hinted (Hinted (TPProofRaw SInteger))
-> ChainsTo (Hinted (Hinted (TPProofRaw SInteger)))
-> ChainsTo (Hinted (Hinted (TPProofRaw SInteger)))
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b
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
, SInteger -> SBool
isOdd SInteger
a SBool -> SBool -> SBool
.&& SInteger -> SBool
isEven SInteger
b SBool -> TPProofRaw SInteger -> (SBool, TPProofRaw SInteger)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> SInteger -> SInteger -> SInteger
nGCDBin SInteger
a (SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2)
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
a, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2))
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD SInteger
a (SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2)
SInteger -> SBool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? SInteger
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* ((SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
-SInteger
1) SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2) SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
+ SInteger
1
TPProofRaw SInteger -> SBool -> Hinted (TPProofRaw SInteger)
forall a b. HintsTo a b => a -> b -> Hinted a
?? SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger
2 SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
* SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2
Hinted (TPProofRaw SInteger)
-> Proof Bool -> Hinted (Hinted (TPProofRaw SInteger))
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
gOddEven Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" ((SInteger
aSInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
-SInteger
1) SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger
b SInteger -> SInteger -> SInteger
`sEDiv` SInteger
2))
Hinted (Hinted (TPProofRaw SInteger))
-> ChainsTo (Hinted (Hinted (TPProofRaw SInteger)))
-> ChainsTo (Hinted (Hinted (TPProofRaw SInteger)))
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b
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
, SInteger -> SBool
isOdd SInteger
b SBool -> TPProofRaw SInteger -> (SBool, TPProofRaw SInteger)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> [(SBool, TPProofRaw SInteger)] -> TPProofRaw SInteger
forall a. [(SBool, TPProofRaw a)] -> TPProofRaw a
cases [ SInteger
a 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
a SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
./= SInteger
0 SBool -> SBool -> SBool
.&& SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.<= SInteger
b SBool -> TPProofRaw SInteger -> (SBool, TPProofRaw SInteger)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> SInteger -> SInteger -> SInteger
nGCDBin SInteger
a SInteger
b
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCDBin SInteger
a (SInteger
b SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
a)
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
a, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger
b SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
a))
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD SInteger
a (SInteger
b SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
a)
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
comm Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
a, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger
b SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
a))
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD (SInteger
b SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
a) SInteger
a
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
gAdd Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" (SInteger
b SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
a), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
a)
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD SInteger
b SInteger
a
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
comm Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
b, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
a)
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b
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
, SInteger
a SInteger -> SInteger -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.> SInteger
b SBool -> TPProofRaw SInteger -> (SBool, TPProofRaw SInteger)
forall a. SBool -> TPProofRaw a -> (SBool, TPProofRaw a)
==> SInteger -> SInteger -> SInteger
nGCDBin SInteger
a SInteger
b
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCDBin (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
b) SInteger
b
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
ih Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
b), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" SInteger
b)
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD (SInteger
a SInteger -> SInteger -> SInteger
forall a. Num a => a -> a -> a
- SInteger
b) SInteger
b
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
gAdd Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" SInteger
a, forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (-SInteger
b))
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD SInteger
a SInteger
b
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
]
]
SMTConfig
-> String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall t.
(Proposition (Forall "a" Integer -> Forall "b" Integer -> SBool),
SymVal t, EqSymbolic (SBV t)) =>
SMTConfig
-> String
-> (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> StepArgs (Forall "a" Integer -> Forall "b" Integer -> SBool) t
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a t.
(Calc a, Proposition a, SymVal t, EqSymbolic (SBV t)) =>
SMTConfig -> String -> a -> StepArgs a t -> TP (Proof a)
calcWith SMTConfig
cvc5 String
"gcdBinEquiv"
(\(Forall SInteger
a) (Forall SInteger
b) -> SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b SInteger -> SInteger -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== SInteger -> SInteger -> SInteger
gcdBin SInteger
a SInteger
b) (StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)))
-> StepArgs
(Forall "a" Integer -> Forall "b" Integer -> SBool) Integer
-> TP (Proof (Forall "a" Integer -> Forall "b" Integer -> SBool))
forall a b. (a -> b) -> a -> b
$
\SInteger
a SInteger
b -> [] [SBool] -> TPProofRaw SInteger -> (SBool, TPProofRaw SInteger)
forall a. [SBool] -> TPProofRaw a -> (SBool, TPProofRaw a)
|- SInteger -> SInteger -> SInteger
gcd SInteger
a SInteger
b
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCD (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a) (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b)
SInteger -> Proof Bool -> Hinted SInteger
forall a b. HintsTo a b => a -> b -> Hinted a
?? Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
nEq Proof (Forall "a" Integer -> Forall "b" Integer -> SBool)
-> IArgs (Forall "a" Integer -> Forall "b" 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 @"a" (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a), forall (nm :: Symbol) a. SBV a -> Inst nm a
Inst @"b" (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b))
TPProofRaw SInteger
-> ChainsTo (TPProofRaw SInteger) -> ChainsTo (TPProofRaw SInteger)
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
nGCDBin (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
a) (SInteger -> SInteger
forall a. Num a => a -> a
abs SInteger
b)
SInteger -> ChainsTo SInteger -> ChainsTo SInteger
forall a. ChainStep a (ChainsTo a) => a -> ChainsTo a -> ChainsTo a
=: SInteger -> SInteger -> SInteger
gcdBin SInteger
a SInteger
b
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