Agda-2.5.2: A dependently typed functional programming language and proof assistant

Safe Haskell | None
Language | Haskell2010

Agda.Termination.CallGraph

Contents

- Calls
- Call graphs

Description

Call graphs and related concepts, more or less as defined in "A Predicative Analysis of Structural Recursion" by Andreas Abel and Thorsten Altenkirch.

Synopsis

- type Node = Int
- type Call cinfo = Edge Node Node (CMSet cinfo)
- mkCall :: Node -> Node -> CallMatrix -> cinfo -> Call cinfo
- mkCall' :: Monoid cinfo => Node -> Node -> CallMatrix -> Call cinfo
- source :: Edge s t e -> s
- target :: Edge s t e -> t
- callMatrixSet :: Call cinfo -> CMSet cinfo
- (>*<) :: (CallComb a, ?cutoff :: CutOff) => a -> a -> a
- newtype CallGraph cinfo = CallGraph {
  - theCallGraph :: Graph Node Node (CMSet cinfo)
  }
- targetNodes :: CallGraph cinfo -> Set Node
- fromList :: [Call cinfo] -> CallGraph cinfo
- toList :: CallGraph cinfo -> [Call cinfo]
- union :: CallGraph cinfo -> CallGraph cinfo -> CallGraph cinfo
- insert :: Node -> Node -> CallMatrix -> cinfo -> CallGraph cinfo -> CallGraph cinfo
- complete :: (?cutoff :: CutOff) => Monoid cinfo => CallGraph cinfo -> CallGraph cinfo
- completionStep :: (?cutoff :: CutOff) => Monoid cinfo => CallGraph cinfo -> CallGraph cinfo -> (CallGraph cinfo, CallGraph cinfo)

# Calls

type Node = Int #

Call graph nodes.

Machine integer `Int` is sufficient, since we cannot index more than we have addresses on our machine.

type Call cinfo = Edge Node Node (CMSet cinfo) #

Calls are edges in the call graph. It can be labelled with several call matrices if there are several pathes from one function to another.

mkCall :: Node -> Node -> CallMatrix -> cinfo -> Call cinfo #

Make a call with a single matrix.

mkCall' :: Monoid cinfo => Node -> Node -> CallMatrix -> Call cinfo #

Make a call with empty `cinfo`.

source :: Edge s t e -> s #

Outgoing node.

target :: Edge s t e -> t #

Incoming node.

callMatrixSet :: Call cinfo -> CMSet cinfo #

(>*<) :: (CallComb a, ?cutoff :: CutOff) => a -> a -> a #

# Call graphs

newtype CallGraph cinfo #

A call graph is a set of calls. Every call also has some associated meta information, which should be `Monoid`al so that the meta information for different calls can be combined when the calls are combined.

Constructors

CallGraph |
Fields theCallGraph :: Graph Node Node (CMSet cinfo)

Instances

Show cinfo => Show (CallGraph cinfo) # |
Methods showsPrec :: Int -> CallGraph cinfo -> ShowS # show :: CallGraph cinfo -> String # showList :: [CallGraph cinfo] -> ShowS #
Semigroup (CallGraph cinfo) # | `CallGraph` is a monoid under `union`.
Methods (<>) :: CallGraph cinfo -> CallGraph cinfo -> CallGraph cinfo # sconcat :: NonEmpty (CallGraph cinfo) -> CallGraph cinfo # stimes :: Integral b => b -> CallGraph cinfo -> CallGraph cinfo #
Monoid (CallGraph cinfo) # |
Methods mempty :: CallGraph cinfo # mappend :: CallGraph cinfo -> CallGraph cinfo -> CallGraph cinfo # mconcat :: [CallGraph cinfo] -> CallGraph cinfo #
Pretty cinfo => Pretty (CallGraph cinfo) # | Displays the recursion behaviour corresponding to a call graph.
Methods pretty :: CallGraph cinfo -> Doc # prettyPrec :: Int -> CallGraph cinfo -> Doc #
Null (CallGraph cinfo) # | `null` checks whether the call graph is completely disconnected.
Methods empty :: CallGraph cinfo # null :: CallGraph cinfo -> Bool #

targetNodes :: CallGraph cinfo -> Set Node #

Returns all the nodes with incoming edges. Somewhat expensive. `O(e)`.

fromList :: [Call cinfo] -> CallGraph cinfo #

Converts a list of calls with associated meta information to a call graph.

toList :: CallGraph cinfo -> [Call cinfo] #

Converts a call graph to a list of calls with associated meta information.

union :: CallGraph cinfo -> CallGraph cinfo -> CallGraph cinfo #

Takes the union of two call graphs.

insert :: Node -> Node -> CallMatrix -> cinfo -> CallGraph cinfo -> CallGraph cinfo #

Inserts a call into a call graph.

complete :: (?cutoff :: CutOff) => Monoid cinfo => CallGraph cinfo -> CallGraph cinfo #

Call graph comparison. A graph `cs'` is ``worse'` than `cs` if it has a new edge (call) or a call got worse, which means that one of its elements that was better or equal to `Le` moved a step towards `Un`.

A call graph is complete if combining it with itself does not make it any worse. This is sound because of monotonicity: By combining a graph with itself, it can only get worse, but if it does not get worse after one such step, it gets never any worse.

``complete` cs` completes the call graph `cs`. A call graph is complete if it contains all indirect calls; if `f -> g` and `g -> h` are present in the graph, then `f -> h` should also be present.

completionStep :: (?cutoff :: CutOff) => Monoid cinfo => CallGraph cinfo -> CallGraph cinfo -> (CallGraph cinfo, CallGraph cinfo) #