Changeset 12719
- Timestamp:
- 26.10.2009 12:08:28 (4 weeks ago)
- Files:
-
- 1 modified
-
trunk/Comorphisms/CASL2PCFOL.hs (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Comorphisms/CASL2PCFOL.hs
r12718 r12719 96 96 -- membership predicates are coded out 97 97 98 mkAxName :: String -> SORT -> SORT -> String 99 mkAxName str s s' = "ga_" ++ str ++ "_" ++ show s ++ "_to_" ++ show s' 100 98 101 -- | Make the name for the embedding or projecton injectivity axiom 99 102 mkInjectivityName :: String -> SORT -> SORT -> String 100 mkInjectivityName str s s' = 101 "ga_" ++ str ++ "_injectivity_" ++ show s ++ "_to_" ++ show s' 103 mkInjectivityName = mkAxName . (++ "_injectivity") 102 104 103 105 -- | Make the name for the embedding injectivity axiom … … 109 111 mkProjInjName s s' = mkInjectivityName "projection" s' s 110 112 113 -- | create a quantified injectivity implication 111 114 mkInjectivity :: (TERM () -> TERM ()) -> VAR_DECL -> VAR_DECL -> FORMULA () 112 115 mkInjectivity f vx vy = mkForall [vx, vy] 113 116 (mkInjImpl f (toQualVar vx) $ toQualVar vy) nullRange 114 117 115 -- 118 -- | create an injectivity implication over x and y 116 119 mkInjImpl :: (TERM () -> TERM ()) -> TERM () -> TERM () -> FORMULA () 117 120 mkInjImpl f x y = mkImpl (mkExEq (f x) (f y)) (mkExEq x y) 118 121 122 -- | apply injection function 123 injectTo :: SORT -> TERM () -> TERM () 124 injectTo s q = injectUnique nullRange q s 125 126 -- | apply (a partial) projection function 127 projectTo :: SORT -> TERM () -> TERM () 128 projectTo s q = projectUnique Partial nullRange q s 129 119 130 -- | Make the named sentence for the embedding injectivity axiom from s to s' 120 131 -- i.e., forall x,y:s . inj(x)=e=inj(y) => x=e=y 121 mkEmbInjAxiom :: SORT -> SORT -> Named (FORMULA ())122 mkEmbInjAxiom s s' = let appInj q = injectUnique nullRange q s' in132 mkEmbInjAxiom :: SORT -> SORT -> Named (FORMULA ()) 133 mkEmbInjAxiom s s' = 123 134 makeNamed (mkEmbInjName s s') 124 $ mkInjectivity appInj(mkVarDeclStr "x" s) $ mkVarDeclStr "y" s135 $ mkInjectivity (injectTo s') (mkVarDeclStr "x" s) $ mkVarDeclStr "y" s 125 136 126 137 -- | Make the named sentence for the projection injectivity axiom from s' to s 127 138 -- i.e., forall x,y:s . pr(x)=e=pr(y) => x=e=y 128 mkProjInjAxiom :: SORT -> SORT -> Named (FORMULA ())129 mkProjInjAxiom s s' = let appProj q = projectUnique Partial nullRange q s in139 mkProjInjAxiom :: SORT -> SORT -> Named (FORMULA ()) 140 mkProjInjAxiom s s' = 130 141 makeNamed (mkProjInjName s s') 131 $ mkInjectivity appProj(mkVarDeclStr "x" s') $ mkVarDeclStr "y" s'142 $ mkInjectivity (projectTo s) (mkVarDeclStr "x" s') $ mkVarDeclStr "y" s' 132 143 133 144 -- | Make the name for the projection axiom 134 145 mkProjName :: SORT -> SORT -> String 135 mkProjName s s' = 136 "ga_projection_" ++ show s ++ "_to_" ++ show s' ++ "_to_" ++ show s 146 mkProjName = mkAxName "projection" 147 148 -- | create an existential equation over x of sort s 149 mkXExEq :: SORT -> (TERM () -> TERM ()) -> (TERM () -> TERM ()) -> FORMULA () 150 mkXExEq s fl fr = let 151 vx = mkVarDeclStr "x" s 152 qualX = toQualVar vx 153 in mkForall [vx] (mkExEq (fl qualX) (fr qualX)) nullRange 137 154 138 155 -- | Make the named sentence for the projection axiom from s' to s 139 156 -- i.e., forall x:s . pr(inj(x))=e=x 140 157 mkProjAxiom:: SORT -> SORT -> Named (FORMULA ()) 141 mkProjAxiom s s' = 142 makeNamed (mkProjName s s') 143 $ (mkForall [vx] 144 (mkExEq 145 (appProj $ injectUnique nullRange qualX s') 146 qualX 147 ) nullRange 148 ) 149 where appProj x = projectUnique Partial nullRange x s 150 vx = mkVarDeclStr "x" s 151 qualX = toQualVar vx 158 mkProjAxiom s s' = makeNamed (mkProjName s s') 159 $ mkXExEq s (projectTo s . injectTo s') id 152 160 153 161 -- | Make the name for the transitivity axiom from s to s' to s'' 154 162 mkTransAxiomName :: SORT -> SORT -> SORT -> String 155 163 mkTransAxiomName s s' s'' = 156 "ga_transitivity_" ++ show s ++ "_to_" ++ shows' ++ "_to_" ++ show s''164 mkAxName "transitivity" s s' ++ "_to_" ++ show s'' 157 165 158 166 -- | Make the named sentence for the transitivity axiom from s to s' to s'' 159 167 -- i.e., forall x:s . inj(inj(x))=e=inj(x) 160 168 mkTransAxiom:: SORT -> SORT -> SORT -> Named (FORMULA ()) 161 mkTransAxiom s s' s'' = 162 makeNamed name 163 (mkForall [vx] 164 (mkExEq 165 (injectUnique nullRange (injectUnique nullRange qualX s') s'') 166 (injectUnique nullRange qualX s'') 167 ) nullRange 168 ) 169 where name = mkTransAxiomName s s' s'' 170 vx = mkVarDeclStr "x" s 171 qualX = toQualVar vx 169 mkTransAxiom s s' s'' = makeNamed (mkTransAxiomName s s' s'') 170 $ mkXExEq s (injectTo s'' . injectTo s') $ injectTo s'' 172 171 173 172 -- | Make the name for the identity axiom from s to s' 174 173 mkIdAxiomName :: SORT -> SORT -> String 175 mkIdAxiomName s s' = 176 "ga_identity_" ++ show s ++ "_to_" ++ show s' ++ "_to_" ++ show s 174 mkIdAxiomName = mkAxName "identity" 177 175 178 176 -- | Make the named sentence for the identity axiom from s to s' 179 177 -- i.e., forall x:s . inj(inj(x))=e=x 180 178 mkIdAxiom:: SORT -> SORT -> Named (FORMULA ()) 181 mkIdAxiom s s' = 182 makeNamed name 183 (mkForall [vx] 184 (mkExEq 185 (injectUnique nullRange (injectUnique nullRange qualX s') s) 186 qualX 187 ) nullRange 188 ) 189 where name = mkIdAxiomName s s' 190 vx = mkVarDeclStr "x" s 191 qualX = toQualVar vx 179 mkIdAxiom s s' = makeNamed (mkIdAxiomName s s') 180 $ mkXExEq s (injectTo s . injectTo s') id 192 181 193 182 generateAxioms :: Sign f e -> [Named (FORMULA ())] 194 generateAxioms sig = map (mapNamed $ renameFormula id) $ concat $195 [[mkEmbInjAxiom s s'] ++ [mkProjInjAxiom s s'] ++ [mkProjAxiom s s']183 generateAxioms sig = concat 184 $ [[mkEmbInjAxiom s s'] ++ [mkProjInjAxiom s s'] ++ [mkProjAxiom s s'] 196 185 | s <- sorts, 197 186 s' <- realSupers s] 198 ++ [[mkTransAxiom s s' s'']187 ++ [[mkTransAxiom s s' s''] 199 188 | s <- sorts, 200 189 s' <- realSupers s, 201 190 s'' <- realSupers s', 202 191 s'' /= s] 203 ++ [[mkIdAxiom s s']192 ++ [[mkIdAxiom s s'] 204 193 | s <- sorts, 205 194 s' <- realSupers s,