bfs: use a Set for visited nodes

This commit is contained in:
hi 2025-08-12 13:28:23 +00:00
parent 7f0afa76a6
commit 56a8dd2b30
2 changed files with 6 additions and 4 deletions

View file

@ -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 =

View file

@ -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