{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeAbstractions #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -Wall -Werror #-}
module Documentation.SBV.Examples.KnuckleDragger.Tao where
import Data.SBV
import Data.SBV.Tools.KnuckleDragger
data T
mkUninterpretedSort ''T
tao :: IO Proof
tao :: IO Proof
tao = 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 op :: ST -> ST -> ST
op :: ST -> ST -> ST
op = String -> ST -> ST -> ST
forall a. SMTDefinable a => String -> a
uninterpret String
"op"
String -> SBool -> [Proof] -> KD Proof
forall a. Proposition a => String -> a -> [Proof] -> KD Proof
lemma String
"tao" ( (Forall "x" T -> Forall "y" T -> SBool) -> SBool
forall a. QuantifiedBool a => a -> SBool
quantifiedBool (\(Forall @"x" ST
x) (Forall @"y" ST
y) -> ((ST
x ST -> ST -> ST
`op` ST
x) ST -> ST -> ST
`op` ST
y) ST -> ST -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== ST
y ST -> ST -> ST
`op` ST
x)
SBool -> SBool -> SBool
.=> (Forall "x" T -> Forall "y" T -> SBool) -> SBool
forall a. QuantifiedBool a => a -> SBool
quantifiedBool (\(Forall @"x" ST
x) (Forall @"y" ST
y) -> (ST
x ST -> ST -> ST
`op` ST
y) ST -> ST -> SBool
forall a. EqSymbolic a => a -> a -> SBool
.== (ST
y ST -> ST -> ST
`op` ST
x)))
[]