module Rule where
import Logic
import Haskell4Maths ( var
, vars)
import F2 (PolF2)
import Transformations ( phi
, theta
, projection)
import Derivative (derivPol)
import Data.List (union)
import Test.QuickCheck (quickCheck)
import qualified Data.Set as S
independenceRule :: PolF2 -> PolF2 -> PolF2 -> PolF2
independenceRule x a1 a2 = aux + a1a2 + aux2
where da1 = derivPol a1 x
da2 = derivPol a2 x
a1a2 = phi $ a1*a2
a1da2 = phi $ a1*da2
a2da1 = phi $ a2*da1
da1da2 = phi $ da1*da2
aux = phi $ a1da2 + a2da1 + da1da2
aux2 = phi $ a1a2*aux
independenceRuleForm :: VarProp -> FProp -> FProp -> FProp
independenceRuleForm p f1 f2 = theta $ independenceRule x p1 p2
where x = projection (Atom p)
p1 = projection f1
p2 = projection f2