{-
    Haskell version of ...

! The Checker module for the Boyer benchmark
! Started by Tony Kitto on March 30th 1988

! Changes Log
! 07-04-88 ADK Tautp function removed to main body
! 08-04-88 ADK bug fix = Truep returns True for (t)
!                        Falsep returns True for (f)

Haskell version::

    23-06-93 JSM initial version

-}

module Checker (tautologyp) where

import Lisplikefns

tautologyp :: (Lisplist, Lisplist, Lisplist) -> Bool
tautologyp (Nil, _, _) = False
tautologyp (term@(Atom x), truelst, _) = truep (term, truelst)
tautologyp (term@(Cons (x, y)), truelst, falselst) =
    if truep (term, truelst) then True
    else if falsep (term, falselst) then False
    else case x of
    	Atom "if" -> if truep (car y, truelst) then
                     	tautologyp (cadr y, truelst, falselst)
                     else if falsep (car y, falselst) then
                     	tautologyp (caddr y, truelst, falselst)
                     else
                        (tautologyp (cadr y, Cons (car y, truelst), falselst)) &&
                        (tautologyp (caddr y, truelst, Cons (car y, falselst)))
    	_         -> False

truep :: (Lisplist, Lisplist) -> Bool
truep (Nil, _) = False
truep (Cons (Atom "t", Nil), _) = True
truep (term, l) = lispmember (term, l)

falsep :: (Lisplist, Lisplist) -> Bool
falsep (Nil, _) = False
falsep (Cons (Atom "f", Nil), _) = True
falsep (term, l) = lispmember (term, l)

lispmember :: (Lisplist, Lisplist) -> Bool
lispmember (e, Cons (x, xs)) | e == x    = True
                             | otherwise = lispmember (e, xs)

lispmember (_, _) = False


