Mon Sep 25 18:24:33 WEST 2006 Daniel Mendes <danielmendes@portugalmail.com>
* WRINF strategy
The Weak reduction to interface normal form strategy is now available as described in the paper
Weak Reduction and Garbage Collection in Interaction Nets by Jorge Sousa Pinto.
{
hunk ./Makefile 277
+src/INReduction.o : src/NetworkControl.hi
hunk ./src/INReduction.hs 5
+ , reduceWRINF
hunk ./src/INReduction.hs 9
+import NetworkControl
hunk ./src/INReduction.hs 245
+
+
+
+-- | WRINF Strategy [_$_]
+reduceWRINF ::(Show n,InfoKind n g, InfoKind e g) => State g n e -> IO ()
+reduceWRINF state = do{;pDoc <- getDocument state
+ ;doc <- PD.getDocument pDoc
+ ;theFrame <- getNetworkFrame state
+ ;network <- return $ getNetwork doc
+ ;pairList <- return $ getNodeAssocs network
+ ;interfaces <- return $ filter isInterfaceNode pairList
+ ;if ((length interfaces) /= 1)
+ then infoDialog theFrame "Error" $ "The WRINF reduction can only be applyed to Interaction Nets with one interface"
+ else do {;interface <- return $ fst $ head interfaces
+ ;if (isTheInterfaceActivePair (dd network interface) network)
+ then do infoDialog theFrame "WRINF is done" $ "Nothing to be done using WRINF strategy";
+ else do {;activePair <- return $ walk network [] interface [_$_]
+ ;case activePair of
+ Nothing -> do {infoDialog theFrame "WRINF is done" $ "Nothing to be done using WRINF strategy";}
+ (Just e) -> do {;selectEdge e state
+ ;reduce state
+ }
+ }
+
+ }
+ }
+
+walk :: Network g n e -> [NodeNr] -> NodeNr -> Maybe EdgeNr
+walk network visited node_start | (node_start `elem` visited) = Nothing
+ | otherwise = let pp = filter (\x -> (isPrincipalPort network node_start x) ==True) [_$_]
+ $ fromMaybe [] $ getPorts $ getNode node_start network
+ in case pp of [_$_]
+ [] -> Nothing;
+ (x:[]) -> let edgeOnPPort = edgeConnectedOnPort network node_start x; [_$_]
+ in case edgeOnPPort of
+ (Just e) -> if (isActivePair e network ) [_$_]
+ then (Just e) [_$_]
+ else let next_node = fst $ fromJust $ otherExtremeOfEdgeConnectedOnPort network node_start x [_$_]
+ in walk network (node_start:visited) next_node;
+ _ -> Nothing;
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_] [_$_]
+[_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_][_^I_] [_$_]
+dd :: Network g n e -> NodeNr -> EdgeNr
+dd nt nr = let por = fromMaybe [] $ getPorts $ getNode nr nt [_$_]
+ in head ( map (\(Just a) -> (a)) $ [_$_]
+ filter (/=Nothing) $ [_$_]
+ map (edgeConnectedOnPort nt nr ) por )
+
+
+-- | checks if the an interface node is an active pair. [_$_]
+isTheInterfaceActivePair :: EdgeNr -> Network g n e -> Bool [_$_]
+isTheInterfaceActivePair edgeNr network = [_$_]
+ case (getPortFrom edge, getPortTo edge) of
+ (Just (nodeNrFrom, portFrom), Just (nodeNrTo, portTo) ) [_$_]
+ -> isPrincipalPort network nodeNrFrom portFrom
+ && isPrincipalPort network nodeNrTo portTo
+ _ -> False
+ where edge = getEdge edgeNr network
+
+
+
+
+
+
+
+
+
+
hunk ./src/Main.hs 16
+--import EnableGUI
hunk ./src/NetworkUI.hs 452
+ ; reduceWRINF <- button netPan
+ [ text := "Reduce WRINF"
+ , on command := reduceWRINF state
+ ]
hunk ./src/NetworkUI.hs 491
+ , widget reduceWRINF [_$_]
hunk ./src/NetworkUI.hs 1241
+ , hrule 350
}