swish-0.2.1: Swish/HaskellRDF/Ruleset.hs
{-# OPTIONS -XMultiParamTypeClasses #-}
--------------------------------------------------------------------------------
-- $Id: Ruleset.hs,v 1.9 2004/01/07 19:49:13 graham Exp $
--
-- Copyright (c) 2003, G. KLYNE. All rights reserved.
-- See end of this file for licence information.
--------------------------------------------------------------------------------
-- |
-- Module : Ruleset
-- Copyright : (c) 2003, Graham Klyne
-- License : GPL V2
--
-- Maintainer : Graham Klyne
-- Stability : provisional
-- Portability : H98
--
-- This module defines a ruleset data type, used to collect information
-- about a ruleset that may contribute torwards inferences in RDF;
-- e.g. RDF and RDFS are rulesets.
--
-- A ruleset consists of a namespace, a collection of axioms and
-- a collection of rules.
--
--------------------------------------------------------------------------------
module Swish.HaskellRDF.Ruleset
( Ruleset(..), RulesetMap
, makeRuleset, getRulesetNamespace, getRulesetAxioms, getRulesetRules
, getRulesetAxiom, getRulesetRule
, getContextAxiom, getMaybeContextAxiom
, getContextRule, getMaybeContextRule
)
where
import Swish.HaskellUtils.Namespace
( Namespace(..)
, ScopedName(..)
, getScopePrefix, getScopeURI
, getQName, getScopedNameURI
, matchName )
import Swish.HaskellRDF.Rule
( Expression(..), Formula(..), Rule(..)
, fwdCheckInference
, showsFormula, showsFormulae, showsWidth
)
import Swish.HaskellUtils.LookupMap
( LookupEntryClass(..), LookupMap(..)
, mapFindMaybe
)
import Data.Maybe
( Maybe(..), isJust, fromJust, fromMaybe, listToMaybe, mapMaybe )
------------------------------------------------------------
-- Ruleset, having namespace, axioms and rules
------------------------------------------------------------
data Ruleset ex = Ruleset
{ rsNamespace :: Namespace
, rsAxioms :: [Formula ex]
, rsRules :: [Rule ex]
}
instance Eq (Ruleset ex) where
r1 == r2 = rsNamespace r1 == rsNamespace r2
instance LookupEntryClass (Ruleset ex) Namespace (Ruleset ex)
where
keyVal r@(Ruleset k _ _) = (k,r)
newEntry (_,r) = r
type RulesetMap ex = LookupMap (Ruleset ex)
makeRuleset :: Namespace -> [Formula ex] -> [Rule ex] -> Ruleset ex
makeRuleset nsp fms rls = Ruleset
{ rsNamespace = nsp
, rsAxioms = fms
, rsRules = rls
}
getRulesetNamespace :: Ruleset ex -> Namespace
getRulesetNamespace = rsNamespace
getRulesetAxioms :: Ruleset ex -> [Formula ex]
getRulesetAxioms = rsAxioms
getRulesetRules :: Ruleset ex -> [Rule ex]
getRulesetRules = rsRules
------------------------------------------------------------
-- Find a named axiom or rule in a ruleset or proof context
------------------------------------------------------------
getRulesetAxiom :: ScopedName -> Ruleset ex -> Maybe (Formula ex)
getRulesetAxiom nam rset =
mapFindMaybe nam (LookupMap (getRulesetAxioms rset))
-- listToMaybe $ filter ( (matchName nam) . formName ) $ getRulesetAxioms rset
getRulesetRule :: ScopedName -> Ruleset ex -> Maybe (Rule ex)
getRulesetRule nam rset =
mapFindMaybe nam (LookupMap (getRulesetRules rset))
-- listToMaybe $ filter ( (matchName nam) . ruleName ) $ getRulesetRules rset
getContextAxiom :: ScopedName -> Formula ex -> [Ruleset ex] -> Formula ex
getContextAxiom nam def rsets = fromMaybe def (getMaybeContextAxiom nam rsets)
{-
foldr (flip fromMaybe) def $ map (getRulesetAxiom nam) rsets
-}
getMaybeContextAxiom :: ScopedName -> [Ruleset ex] -> Maybe (Formula ex)
getMaybeContextAxiom nam rsets =
listToMaybe $ mapMaybe (getRulesetAxiom nam) rsets
getContextRule :: ScopedName -> Rule ex -> [Ruleset ex] -> Rule ex
getContextRule nam def rsets = fromMaybe def (getMaybeContextRule nam rsets)
{-
foldr (flip fromMaybe) def $ map (getRulesetRule nam) rsets
-}
getMaybeContextRule :: ScopedName -> [Ruleset ex] -> Maybe (Rule ex)
getMaybeContextRule nam rsets =
listToMaybe $ mapMaybe (getRulesetRule nam) rsets
--------------------------------------------------------------------------------
--
-- Copyright (c) 2003, G. KLYNE. All rights reserved.
--
-- This file is part of Swish.
--
-- Swish is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- Swish is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with Swish; if not, write to:
-- The Free Software Foundation, Inc.,
-- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
--
--------------------------------------------------------------------------------
-- $Source: /file/cvsdev/HaskellRDF/Ruleset.hs,v $
-- $Author: graham $
-- $Revision: 1.9 $
-- $Log: Ruleset.hs,v $
-- Revision 1.9 2004/01/07 19:49:13 graham
-- Reorganized RDFLabel details to eliminate separate language field,
-- and to use ScopedName rather than QName.
-- Removed some duplicated functions from module Namespace.
--
-- Revision 1.8 2003/12/11 19:11:07 graham
-- Script processor passes all initial tests.
--
-- Revision 1.7 2003/12/10 03:48:58 graham
-- SwishScript nearly complete: BwdChain and PrrofCheck to do.
--
-- Revision 1.6 2003/12/08 23:55:36 graham
-- Various enhancements to variable bindings and proof structure.
-- New module BuiltInMap coded and tested.
-- Script processor is yet to be completed.
--
-- Revision 1.5 2003/12/04 02:53:27 graham
-- More changes to LookupMap functions.
-- SwishScript logic part complete, type-checks OK.
--
-- Revision 1.4 2003/11/13 01:13:48 graham
-- Reworked ruleset to use ScopedName lookup.
-- Various minor fixes.
--
-- Revision 1.3 2003/10/02 13:41:26 graham
-- Supporting changes for RDF axioms and rules defined as Rulesets,
-- and moved out of module RDFProofCheck.
-- Datatype named using ScopedName rather than QName
-- (Datatype framework is still work in progress).
--
-- Revision 1.2 2003/09/30 20:02:40 graham
-- Proof mechanisms now use scoped names and rulesets.
-- Move some functionality between modules so that RDFProofCheck
-- contains less generic code.
--
-- Revision 1.1 2003/09/30 16:38:19 graham
-- Add Ruleset and RDFRuleset modules to provide proof context elements
--