{-
Haskell version of ...
! Hope+ version of the Gabriel benchmark Boyer
! Started on 30th March 1988 by Tony Kitto
! Changes Log
! 07-04-88 ADK incorporated setup functions and tautp function
! 25-05-88 ADK changed to use LUT instead of assoclist for lemmas
Haskell version:
23-06-93 JSM initial version
-}
module Main(main) where
import Lisplikefns
import Rewritefns
import Rulebasetext
import Checker
-- set-up functions for creating rulebase from text strings
lemmas :: LUT
lemmas = addlemmalst (makelemmas rules) newLUT
makelemmas :: [String] -> [Lisplist]
makelemmas [] = []
makelemmas (h:t) = mkLisplist (strToToken h) : (makelemmas t)
addlemmalst :: [Lisplist] -> LUT -> LUT
addlemmalst [] term = term
addlemmalst (h:t) term = addlemmalst t (addlemma h term)
addlemma :: Lisplist -> LUT -> LUT
addlemma Nil term = term
addlemma (Atom x) term = error "Atoms can't be lemmas"
addlemma (Cons (x, y)) term
| tv x == "equal" && not (atom z) = addtoLUT (tv (car z), Cons(x, y), term)
| otherwise = error "Malformed lemma"
where z = car y
{-
Main function rewrites the test statement into canonical form
and invokes the tautology checker
-}
tautp :: Lisplist -> Bool
tautp term = tautologyp (rewrite term lemmas, Nil, Nil)
{-
The test statement and
the substitution terms used to expand the test statement
-}
statement :: Lisplist
statement = mkLisplist (strToToken
("( implies ( and ( implies x y )\
\( and ( implies y z )\
\( and ( implies z u )\
\( implies u w ) ) ) )\
\( implies x w ) )"))
subterm :: Lisplist
subterm = mkLisplist (strToToken
("( ( x f ( plus ( plus a b )\
\( plus c ( zero ) ) ) )\
\( y f ( times ( times a b )\
\( plus c d ) ) )\
\( z f ( reverse ( append ( append a b ) \
\( [] ) ) ) )\
\(u equal ( plus a b ) ( difference x y ) )\
\(w lessp ( remainder a b )\
\( member a ( length b ) ) ) )"))
teststatement :: Lisplist
teststatement = applysubst subterm statement
testresult :: Bool
testresult = tautp teststatement
report :: Bool -> String
report True = "The term is a tautology\n"
report False = "The term is not a tautology\n"
main = putStr (report testresult)