prolog_in_haskell/app/Database.hs

30 lines
645 B
Haskell

module Database
( Clause(..)
, Database(..)
, seekAndInstantiate, seek
) where
import Binding
import Nondeterminism
import Terms
import Control.Monad
import Control.Applicative
data Clause = Clause Term [Term]
data Database = Database
{ clauses :: [PrologStream Clause]
}
seekAndInstantiate :: Term -> Database -> PrologStream Term
seekAndInstantiate goal db = do
seek goal db
instantiate goal
seek :: Term -> Database -> PrologStream ()
seek goal db = do
foldr (<|>) mzero (map doClause (clauses db))
where
doClause clause = do
Clause chead body <- clause
unify goal chead
forM_ body $ \newGoal -> seek newGoal db