bfs: use a Set for visited nodes
This commit is contained in:
parent
7f0afa76a6
commit
56a8dd2b30
2 changed files with 6 additions and 4 deletions
|
@ -1,7 +1,9 @@
|
||||||
module Logic.Graph where
|
module Logic.Graph where
|
||||||
|
|
||||||
bfs :: Eq a => a -> a -> (a -> [(edge, a)]) -> Maybe [edge]
|
import Data.Set (Set, insert)
|
||||||
bfs goal start getEdges = reverse <$> aux [([], start)] []
|
|
||||||
|
bfs :: (Eq a, Ord a) => a -> a -> (a -> [(edge, a)]) -> Maybe [edge]
|
||||||
|
bfs goal start getEdges = reverse <$> aux [([], start)] mempty
|
||||||
where
|
where
|
||||||
aux [] _ = Nothing
|
aux [] _ = Nothing
|
||||||
aux ((path, vertex):queue) visited
|
aux ((path, vertex):queue) visited
|
||||||
|
@ -12,7 +14,7 @@ bfs goal start getEdges = reverse <$> aux [([], start)] []
|
||||||
case filter (\(_, v) -> v == goal) new of
|
case filter (\(_, v) -> v == goal) new of
|
||||||
[] ->
|
[] ->
|
||||||
let queue' = queue ++ map (\(edge, next) -> (edge:path, next)) new
|
let queue' = queue ++ map (\(edge, next) -> (edge:path, next)) new
|
||||||
in aux queue' (vertex:visited)
|
in aux queue' $ insert vertex visited
|
||||||
((edge, _):_) -> Just (edge:path)
|
((edge, _):_) -> Just (edge:path)
|
||||||
|
|
||||||
getUnvisitedAdjacent vertex visited =
|
getUnvisitedAdjacent vertex visited =
|
||||||
|
|
|
@ -9,7 +9,7 @@ data Statement
|
||||||
| Or Statement Statement
|
| Or Statement Statement
|
||||||
| Implies Statement Statement
|
| Implies Statement Statement
|
||||||
| Iff Statement Statement
|
| Iff Statement Statement
|
||||||
deriving (Show, Eq)
|
deriving (Eq, Ord, Show)
|
||||||
|
|
||||||
atoms :: Statement -> [String]
|
atoms :: Statement -> [String]
|
||||||
atoms = toAscList . mkSet
|
atoms = toAscList . mkSet
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue