Diff.hs revision 34bff097c14521b5e57ce37279a34256e1f78aa5
0066eddda7203f6345b56f77d146a759298dc635gryzor{- |
0066eddda7203f6345b56f77d146a759298dc635gryzorModule : $Header$
0066eddda7203f6345b56f77d146a759298dc635gryzorCopyright : (c) Klaus L�ttich, Uni Bremen 2005
dbf005d9197b5918404a963cb0e9caf410c7059flgentisLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
0066eddda7203f6345b56f77d146a759298dc635gryzor
0066eddda7203f6345b56f77d146a759298dc635gryzorMaintainer : Christian.Maeder@dfki.de
0066eddda7203f6345b56f77d146a759298dc635gryzorStability : provisional
0066eddda7203f6345b56f77d146a759298dc635gryzorPortability : portable
0066eddda7203f6345b56f77d146a759298dc635gryzor
0066eddda7203f6345b56f77d146a759298dc635gryzorProvides functions that calculate differences in ATerms.
0066eddda7203f6345b56f77d146a759298dc635gryzor
0066eddda7203f6345b56f77d146a759298dc635gryzor-}
0066eddda7203f6345b56f77d146a759298dc635gryzor
0066eddda7203f6345b56f77d146a759298dc635gryzor
0066eddda7203f6345b56f77d146a759298dc635gryzormodule Common.ATerm.Diff (atDiff) where
0066eddda7203f6345b56f77d146a759298dc635gryzor
0066eddda7203f6345b56f77d146a759298dc635gryzorimport Common.ATerm.Unshared
0066eddda7203f6345b56f77d146a759298dc635gryzor
0066eddda7203f6345b56f77d146a759298dc635gryzorimport Data.List
0066eddda7203f6345b56f77d146a759298dc635gryzor
0066eddda7203f6345b56f77d146a759298dc635gryzor-- | all diferences between both terms are replaced by appropiate
0066eddda7203f6345b56f77d146a759298dc635gryzor-- placeholders (in @\<\>@) and the differing terms are added to the
0066eddda7203f6345b56f77d146a759298dc635gryzor-- list of ATerm as arguments to the function symbol @diff@.
0066eddda7203f6345b56f77d146a759298dc635gryzor--
0066eddda7203f6345b56f77d146a759298dc635gryzor-- /Note:
0066eddda7203f6345b56f77d146a759298dc635gryzor-- this function ignores annotions and the resulting ATerm does not
0066eddda7203f6345b56f77d146a759298dc635gryzor-- contain any annotation!/
8cf362f300047e397e95acfab0b69ef7a6f3d93clgentis
0066eddda7203f6345b56f77d146a759298dc635gryzoratDiff :: ATerm -> ATerm -> (ATerm,[ATerm])
0066eddda7203f6345b56f77d146a759298dc635gryzoratDiff a1@(AAppl s1 atl1 _) a2@(AAppl s2 atl2 _)
0066eddda7203f6345b56f77d146a759298dc635gryzor | s1 == s2 && atl1 == atl2 = (AAppl s1 atl1 [],[])
0066eddda7203f6345b56f77d146a759298dc635gryzor | s1 == s2 &&
0066eddda7203f6345b56f77d146a759298dc635gryzor length atl1 == length atl2 =
0066eddda7203f6345b56f77d146a759298dc635gryzor case atDiffL atl1 atl2 of
0066eddda7203f6345b56f77d146a759298dc635gryzor (diffs,atl) -> (AAppl s1 atl [],diffs)
0066eddda7203f6345b56f77d146a759298dc635gryzor | otherwise = (AAppl "<diff-appls>" [] [],[AAppl "diff" [a1,a2] []])
8cf362f300047e397e95acfab0b69ef7a6f3d93clgentisatDiff a1@(AInt i1 _) a2@(AInt i2 _)
0066eddda7203f6345b56f77d146a759298dc635gryzor | i1 == i2 = (AInt i1 [],[])
0066eddda7203f6345b56f77d146a759298dc635gryzor | otherwise = (AAppl "<diff-int>" [] [],[AAppl "diff" [a1,a2] []])
8cf362f300047e397e95acfab0b69ef7a6f3d93clgentisatDiff a1@(AList l1 _) a2@(AList l2 _)
8cf362f300047e397e95acfab0b69ef7a6f3d93clgentis | l1 == l2 = (AList l1 [],[])
0066eddda7203f6345b56f77d146a759298dc635gryzor | length l1 == length l2 =
8cf362f300047e397e95acfab0b69ef7a6f3d93clgentis case atDiffL l1 l2 of
8cf362f300047e397e95acfab0b69ef7a6f3d93clgentis (diffs,atl) -> (AList atl [],diffs)
0066eddda7203f6345b56f77d146a759298dc635gryzor | otherwise = (AList [AAppl "<diff-lists>" [] []] [],
8cf362f300047e397e95acfab0b69ef7a6f3d93clgentis [AAppl "diff" [a1,a2] []])
0066eddda7203f6345b56f77d146a759298dc635gryzoratDiff a1 a2 = (AAppl "<diff-types>" [] [],[AAppl "diff" [a1,a2] []])
0066eddda7203f6345b56f77d146a759298dc635gryzor
0066eddda7203f6345b56f77d146a759298dc635gryzor
8cf362f300047e397e95acfab0b69ef7a6f3d93clgentisatDiffL :: [ATerm] -> [ATerm] -> ([ATerm],[ATerm])
8cf362f300047e397e95acfab0b69ef7a6f3d93clgentisatDiffL atl1 atl2 =
8cf362f300047e397e95acfab0b69ef7a6f3d93clgentis mapAccumL (\ acc (ia1,ia2) ->
0066eddda7203f6345b56f77d146a759298dc635gryzor case atDiff ia1 ia2 of
e1f52108da39e2914eb8941eca6257f6588e07b0lgentis (at,diffs) -> (acc++diffs,at)) [] (zip atl1 atl2)
e1f52108da39e2914eb8941eca6257f6588e07b0lgentis