module FirstOrderTheory.Syntax(
Literal, Atom, Term,
NNFFormula, nnfLit, nnfCon, nnfDis,
toPropositionalCNF,
negateLit,
atomArgs, predicateName, isFunctionWithName,
isNeg, getAtom, varName, intVal, funcArgs,
lit, nLit, atom, func, var, intConst) where
import Data.List as L
import Proper.CNF
import Proper.Formula
import FirstOrderTheory.Utils
data NNFFormula
= Con NNFFormula NNFFormula
| Dis NNFFormula NNFFormula
| LF Literal
deriving (Eq, Ord, Show)
nnfLit :: Literal -> NNFFormula
nnfLit l = LF l
nnfCon l r = Con l r
nnfDis l r = Dis l r
toPropositionalCNF :: NNFFormula -> CNF Literal
toPropositionalCNF formula = toCNF $ toProperFormula formula
toProperFormula :: NNFFormula -> Formula Literal
toProperFormula (LF l) = val l
toProperFormula (Con l r) = con (toProperFormula l) (toProperFormula r)
toProperFormula (Dis l r) = dis (toProperFormula l) (toProperFormula l)
data Literal
= Lit Atom
| Neg Atom
deriving (Eq, Ord)
lit = Lit
nLit = Neg
isNeg :: Literal -> Bool
isNeg (Neg _) = True
isNeg _ = False
negateLit (Lit a) = Neg a
negateLit (Neg a) = Lit a
getAtom :: Literal -> Atom
getAtom (Neg a) = a
getAtom (Lit a) = a
instance Show Literal where
show (Lit p) = show p
show (Neg p) = "~" ++ show p
data Atom = Atom Name [Term]
deriving (Eq, Ord)
atom = Atom
atomArgs (Atom _ args) = args
predicateName (Atom n _) = n
instance Show Atom where
show (Atom name args) = name ++ "[" ++ (L.intercalate ", " $ L.map show args) ++ "]"
data Term
= Function Name [Term]
| Variable Name
| Integer Int
deriving (Eq, Ord)
func = Function
var = Variable
intConst = Integer
isFunctionWithName n (Function m _) = n == m
isFunctionWithName _ _ = False
varName (Variable n) = n
funcArgs (Function _ args) = args
intVal (Integer i) = i
instance Show Term where
show (Integer val) = show val
show (Variable name) = name
show (Function name args) = name ++ "(" ++ (L.intercalate ", " $ L.map show args) ++ ")"