{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeAbstractions #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -Wall -Werror #-}
module Documentation.SBV.Examples.KnuckleDragger.Basics where
import Data.SBV
import Data.SBV.Tools.KnuckleDragger
#ifndef HADDOCK
#endif
trueIsProvable :: IO Proof
trueIsProvable :: IO Proof
trueIsProvable = KD Proof -> IO Proof
forall a. KD a -> IO a
runKD (KD Proof -> IO Proof) -> KD Proof -> IO Proof
forall a b. (a -> b) -> a -> b
$ String -> SBool -> [Proof] -> KD Proof
forall a. Proposition a => String -> a -> [Proof] -> KD Proof
lemma String
"true" SBool
sTrue []
falseIsn'tProvable :: IO ()
falseIsn'tProvable :: IO ()
falseIsn'tProvable = KD () -> IO ()
forall a. KD a -> IO a
runKD (KD () -> IO ()) -> KD () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
_won'tGoThrough <- String -> SBool -> [Proof] -> KD Proof
forall a. Proposition a => String -> a -> [Proof] -> KD Proof
lemma String
"sFalse" SBool
sFalse []
pure ()
largerIntegerExists :: IO Proof
largerIntegerExists :: IO Proof
largerIntegerExists = KD Proof -> IO Proof
forall a. KD a -> IO a
runKD (KD Proof -> IO Proof) -> KD Proof -> IO Proof
forall a b. (a -> b) -> a -> b
$ String
-> (Forall "x" Integer -> Exists "y" Integer -> SBool)
-> [Proof]
-> KD Proof
forall a. Proposition a => String -> a -> [Proof] -> KD Proof
lemma String
"largerIntegerExists"
(\(Forall @"x" SBV Integer
x) (Exists @"y" SBV Integer
y) -> SBV Integer
x SBV Integer -> SBV Integer -> SBool
forall a. OrdSymbolic a => a -> a -> SBool
.< (SBV Integer
y :: SInteger))
[]
data T
mkUninterpretedSort ''T
forallConjunction :: IO Proof
forallConjunction :: IO Proof
forallConjunction = KD Proof -> IO Proof
forall a. KD a -> IO a
runKD (KD Proof -> IO Proof) -> KD Proof -> IO Proof
forall a b. (a -> b) -> a -> b
$ do
let p, q :: ST -> SBool
p :: ST -> SBool
p = String -> ST -> SBool
forall a. SMTDefinable a => String -> a
uninterpret String
"p"
q :: ST -> SBool
q = String -> ST -> SBool
forall a. SMTDefinable a => String -> a
uninterpret String
"q"
qb :: (Forall "x" T -> SBool) -> SBool
qb = (Forall "x" T -> SBool) -> SBool
forall a. QuantifiedBool a => a -> SBool
quantifiedBool
String -> SBool -> [Proof] -> KD Proof
forall a. Proposition a => String -> a -> [Proof] -> KD Proof
lemma String
"forallConjunction"
( ((Forall "x" T -> SBool) -> SBool
qb (\(Forall @"x" ST
x) -> ST -> SBool
p ST
x) SBool -> SBool -> SBool
.&& (Forall "x" T -> SBool) -> SBool
qb (\(Forall @"x" ST
x) -> ST -> SBool
q ST
x))
SBool -> SBool -> SBool
.<=>
(Forall "x" T -> SBool) -> SBool
qb (\(Forall @"x" ST
x) -> ST -> SBool
p ST
x SBool -> SBool -> SBool
.&& ST -> SBool
q ST
x)
)
[]
existsDisjunction :: IO Proof
existsDisjunction :: IO Proof
existsDisjunction = KD Proof -> IO Proof
forall a. KD a -> IO a
runKD (KD Proof -> IO Proof) -> KD Proof -> IO Proof
forall a b. (a -> b) -> a -> b
$ do
let p, q :: ST -> SBool
p :: ST -> SBool
p = String -> ST -> SBool
forall a. SMTDefinable a => String -> a
uninterpret String
"p"
q :: ST -> SBool
q = String -> ST -> SBool
forall a. SMTDefinable a => String -> a
uninterpret String
"q"
qb :: (Exists "x" T -> SBool) -> SBool
qb = (Exists "x" T -> SBool) -> SBool
forall a. QuantifiedBool a => a -> SBool
quantifiedBool
String -> SBool -> [Proof] -> KD Proof
forall a. Proposition a => String -> a -> [Proof] -> KD Proof
lemma String
"existsDisjunction"
( ((Exists "x" T -> SBool) -> SBool
qb (\(Exists @"x" ST
x) -> ST -> SBool
p ST
x) SBool -> SBool -> SBool
.|| (Exists "x" T -> SBool) -> SBool
qb (\(Exists @"x" ST
x) -> ST -> SBool
q ST
x))
SBool -> SBool -> SBool
.<=>
(Exists "x" T -> SBool) -> SBool
qb (\(Exists @"x" ST
x) -> ST -> SBool
p ST
x SBool -> SBool -> SBool
.|| ST -> SBool
q ST
x)
)
[]
forallDisjunctionNot :: IO ()
forallDisjunctionNot :: IO ()
forallDisjunctionNot = KD () -> IO ()
forall a. KD a -> IO a
runKD (KD () -> IO ()) -> KD () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
let p, q :: ST -> SBool
p :: ST -> SBool
p = String -> ST -> SBool
forall a. SMTDefinable a => String -> a
uninterpret String
"p"
q :: ST -> SBool
q = String -> ST -> SBool
forall a. SMTDefinable a => String -> a
uninterpret String
"q"
qb :: (Forall "x" T -> SBool) -> SBool
qb = (Forall "x" T -> SBool) -> SBool
forall a. QuantifiedBool a => a -> SBool
quantifiedBool
_won'tGoThrough <- String -> SBool -> [Proof] -> KD Proof
forall a. Proposition a => String -> a -> [Proof] -> KD Proof
lemma String
"forallConjunctionNot"
( ((Forall "x" T -> SBool) -> SBool
qb (\(Forall @"x" ST
x) -> ST -> SBool
p ST
x) SBool -> SBool -> SBool
.|| (Forall "x" T -> SBool) -> SBool
qb (\(Forall @"x" ST
x) -> ST -> SBool
q ST
x))
SBool -> SBool -> SBool
.<=>
(Forall "x" T -> SBool) -> SBool
qb (\(Forall @"x" ST
x) -> ST -> SBool
p ST
x SBool -> SBool -> SBool
.|| ST -> SBool
q ST
x)
)
[]
pure ()
existsConjunctionNot :: IO ()
existsConjunctionNot :: IO ()
existsConjunctionNot = KD () -> IO ()
forall a. KD a -> IO a
runKD (KD () -> IO ()) -> KD () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
let p, q :: ST -> SBool
p :: ST -> SBool
p = String -> ST -> SBool
forall a. SMTDefinable a => String -> a
uninterpret String
"p"
q :: ST -> SBool
q = String -> ST -> SBool
forall a. SMTDefinable a => String -> a
uninterpret String
"q"
qb :: (Exists "x" T -> SBool) -> SBool
qb = (Exists "x" T -> SBool) -> SBool
forall a. QuantifiedBool a => a -> SBool
quantifiedBool
_wont'GoThrough <- String -> SBool -> [Proof] -> KD Proof
forall a. Proposition a => String -> a -> [Proof] -> KD Proof
lemma String
"existsConjunctionNot"
( ((Exists "x" T -> SBool) -> SBool
qb (\(Exists @"x" ST
x) -> ST -> SBool
p ST
x) SBool -> SBool -> SBool
.&& (Exists "x" T -> SBool) -> SBool
qb (\(Exists @"x" ST
x) -> ST -> SBool
q ST
x))
SBool -> SBool -> SBool
.<=>
(Exists "x" T -> SBool) -> SBool
qb (\(Exists @"x" ST
x) -> ST -> SBool
p ST
x SBool -> SBool -> SBool
.&& ST -> SBool
q ST
x)
)
[]
pure ()