# Walks in directed graphs ```agda module graph-theory.walks-directed-graphs where ``` <details><summary>Imports</summary> ```agda open import elementary-number-theory.natural-numbers open import foundation.action-on-identifications-functions open import foundation.cartesian-product-types open import foundation.commuting-squares-of-maps open import foundation.contractible-types open import foundation.coproduct-types open import foundation.dependent-pair-types open import foundation.equivalences open import foundation.function-types open import foundation.functoriality-cartesian-product-types open import foundation.functoriality-dependent-pair-types open import foundation.homotopies open import foundation.identity-types open import foundation.injective-maps open import foundation.negated-equality open import foundation.raising-universe-levels open import foundation.torsorial-type-families open import foundation.transport-along-identifications open import foundation.universe-levels open import graph-theory.directed-graphs open import graph-theory.equivalences-directed-graphs open import graph-theory.morphisms-directed-graphs ``` </details> ## Idea A **walk** in a [directed graph](graph-theory.directed-graphs.md) from a vertex `x` to a vertex `y` is a [list](lists.lists.md) of edges that connect `x` to `y`. Since every journey begins with a single step, we define the `cons` operation on walks in directed graphs with an edge from the source in the first argument, and a walk to the target in the second argument. ## Definitions ### The type of walks from `x` to `y` in `G` ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) where data walk-Directed-Graph : (x y : vertex-Directed-Graph G) → UU (l1 ⊔ l2) where refl-walk-Directed-Graph : {x : vertex-Directed-Graph G} → walk-Directed-Graph x x cons-walk-Directed-Graph : {x y z : vertex-Directed-Graph G} → edge-Directed-Graph G x y → walk-Directed-Graph y z → walk-Directed-Graph x z unit-walk-Directed-Graph : {x y : vertex-Directed-Graph G} (e : edge-Directed-Graph G x y) → walk-Directed-Graph x y unit-walk-Directed-Graph e = cons-walk-Directed-Graph e refl-walk-Directed-Graph snoc-walk-Directed-Graph : {x y z : vertex-Directed-Graph G} → walk-Directed-Graph x y → edge-Directed-Graph G y z → walk-Directed-Graph x z snoc-walk-Directed-Graph refl-walk-Directed-Graph e = unit-walk-Directed-Graph e snoc-walk-Directed-Graph (cons-walk-Directed-Graph f w) e = cons-walk-Directed-Graph f (snoc-walk-Directed-Graph w e) ``` ### The type of walks in a directed graph, defined dually ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) where data walk-Directed-Graph' : (x y : vertex-Directed-Graph G) → UU (l1 ⊔ l2) where refl-walk-Directed-Graph' : {x : vertex-Directed-Graph G} → walk-Directed-Graph' x x snoc-walk-Directed-Graph' : {x y z : vertex-Directed-Graph G} → walk-Directed-Graph' x y → edge-Directed-Graph G y z → walk-Directed-Graph' x z unit-walk-Directed-Graph' : {x y : vertex-Directed-Graph G} → edge-Directed-Graph G x y → walk-Directed-Graph' x y unit-walk-Directed-Graph' e = snoc-walk-Directed-Graph' refl-walk-Directed-Graph' e cons-walk-Directed-Graph' : {x y z : vertex-Directed-Graph G} → edge-Directed-Graph G x y → walk-Directed-Graph' y z → walk-Directed-Graph' x z cons-walk-Directed-Graph' e refl-walk-Directed-Graph' = unit-walk-Directed-Graph' e cons-walk-Directed-Graph' e (snoc-walk-Directed-Graph' w f) = snoc-walk-Directed-Graph' (cons-walk-Directed-Graph' e w) f ``` ### The length of a walk in `G` ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) where length-walk-Directed-Graph : {x y : vertex-Directed-Graph G} → walk-Directed-Graph G x y → ℕ length-walk-Directed-Graph refl-walk-Directed-Graph = 0 length-walk-Directed-Graph (cons-walk-Directed-Graph x w) = succ-ℕ (length-walk-Directed-Graph w) ``` ### The type of walks of length `n` from `x` to `y` in `G` ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) where walk-of-length-Directed-Graph : ℕ → (x y : vertex-Directed-Graph G) → UU (l1 ⊔ l2) walk-of-length-Directed-Graph zero-ℕ x y = raise l2 (y = x) walk-of-length-Directed-Graph (succ-ℕ n) x y = Σ ( vertex-Directed-Graph G) ( λ z → edge-Directed-Graph G x z × walk-of-length-Directed-Graph n z y) map-compute-total-walk-of-length-Directed-Graph : (x y : vertex-Directed-Graph G) → Σ ℕ (λ n → walk-of-length-Directed-Graph n x y) → walk-Directed-Graph G x y map-compute-total-walk-of-length-Directed-Graph x .x (zero-ℕ , map-raise refl) = refl-walk-Directed-Graph map-compute-total-walk-of-length-Directed-Graph x y (succ-ℕ n , z , e , w) = cons-walk-Directed-Graph e ( map-compute-total-walk-of-length-Directed-Graph z y (n , w)) map-inv-compute-total-walk-of-length-Directed-Graph : (x y : vertex-Directed-Graph G) → walk-Directed-Graph G x y → Σ ℕ (λ n → walk-of-length-Directed-Graph n x y) map-inv-compute-total-walk-of-length-Directed-Graph x .x refl-walk-Directed-Graph = (0 , map-raise refl) map-inv-compute-total-walk-of-length-Directed-Graph x y ( cons-walk-Directed-Graph {y = z} e w) = map-Σ ( λ n → walk-of-length-Directed-Graph n x y) ( succ-ℕ) ( λ k u → (z , e , u)) ( map-inv-compute-total-walk-of-length-Directed-Graph z y w) is-section-map-inv-compute-total-walk-of-length-Directed-Graph : (x y : vertex-Directed-Graph G) → ( map-compute-total-walk-of-length-Directed-Graph x y ∘ map-inv-compute-total-walk-of-length-Directed-Graph x y) ~ id is-section-map-inv-compute-total-walk-of-length-Directed-Graph x .x refl-walk-Directed-Graph = refl is-section-map-inv-compute-total-walk-of-length-Directed-Graph x y (cons-walk-Directed-Graph {y = z} e w) = ap ( cons-walk-Directed-Graph e) ( is-section-map-inv-compute-total-walk-of-length-Directed-Graph z y w) is-retraction-map-inv-compute-total-walk-of-length-Directed-Graph : (x y : vertex-Directed-Graph G) → ( map-inv-compute-total-walk-of-length-Directed-Graph x y ∘ map-compute-total-walk-of-length-Directed-Graph x y) ~ id is-retraction-map-inv-compute-total-walk-of-length-Directed-Graph x .x (zero-ℕ , map-raise refl) = refl is-retraction-map-inv-compute-total-walk-of-length-Directed-Graph x y (succ-ℕ n , (z , e , w)) = ap ( map-Σ ( λ n → walk-of-length-Directed-Graph n x y) ( succ-ℕ) ( λ k u → (z , e , u))) ( is-retraction-map-inv-compute-total-walk-of-length-Directed-Graph z y ( n , w)) is-equiv-map-compute-total-walk-of-length-Directed-Graph : (x y : vertex-Directed-Graph G) → is-equiv (map-compute-total-walk-of-length-Directed-Graph x y) is-equiv-map-compute-total-walk-of-length-Directed-Graph x y = is-equiv-is-invertible ( map-inv-compute-total-walk-of-length-Directed-Graph x y) ( is-section-map-inv-compute-total-walk-of-length-Directed-Graph x y) ( is-retraction-map-inv-compute-total-walk-of-length-Directed-Graph x y) compute-total-walk-of-length-Directed-Graph : (x y : vertex-Directed-Graph G) → Σ ℕ (λ n → walk-of-length-Directed-Graph n x y) ≃ walk-Directed-Graph G x y pr1 (compute-total-walk-of-length-Directed-Graph x y) = map-compute-total-walk-of-length-Directed-Graph x y pr2 (compute-total-walk-of-length-Directed-Graph x y) = is-equiv-map-compute-total-walk-of-length-Directed-Graph x y ``` ### Concatenation of walks ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) where concat-walk-Directed-Graph : {x y z : vertex-Directed-Graph G} → walk-Directed-Graph G x y → walk-Directed-Graph G y z → walk-Directed-Graph G x z concat-walk-Directed-Graph refl-walk-Directed-Graph v = v concat-walk-Directed-Graph (cons-walk-Directed-Graph e u) v = cons-walk-Directed-Graph e (concat-walk-Directed-Graph u v) ``` ## Properties ### The two dual definitions of walks are equivalent ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) where map-compute-walk-Directed-Graph : {x y : vertex-Directed-Graph G} → walk-Directed-Graph G x y → walk-Directed-Graph' G x y map-compute-walk-Directed-Graph refl-walk-Directed-Graph = refl-walk-Directed-Graph' map-compute-walk-Directed-Graph (cons-walk-Directed-Graph e w) = cons-walk-Directed-Graph' G e (map-compute-walk-Directed-Graph w) compute-snoc-map-compute-walk-Directed-Graph : {x y z : vertex-Directed-Graph G} (w : walk-Directed-Graph G x y) (e : edge-Directed-Graph G y z) → map-compute-walk-Directed-Graph (snoc-walk-Directed-Graph G w e) = snoc-walk-Directed-Graph' (map-compute-walk-Directed-Graph w) e compute-snoc-map-compute-walk-Directed-Graph refl-walk-Directed-Graph e = refl compute-snoc-map-compute-walk-Directed-Graph ( cons-walk-Directed-Graph f w) ( e) = ap ( cons-walk-Directed-Graph' G f) ( compute-snoc-map-compute-walk-Directed-Graph w e) map-inv-compute-walk-Directed-Graph : {x y : vertex-Directed-Graph G} → walk-Directed-Graph' G x y → walk-Directed-Graph G x y map-inv-compute-walk-Directed-Graph refl-walk-Directed-Graph' = refl-walk-Directed-Graph map-inv-compute-walk-Directed-Graph (snoc-walk-Directed-Graph' w e) = snoc-walk-Directed-Graph G (map-inv-compute-walk-Directed-Graph w) e compute-cons-map-inv-compute-walk-Directed-Graph : {x y z : vertex-Directed-Graph G} (e : edge-Directed-Graph G x y) (w : walk-Directed-Graph' G y z) → map-inv-compute-walk-Directed-Graph (cons-walk-Directed-Graph' G e w) = cons-walk-Directed-Graph e (map-inv-compute-walk-Directed-Graph w) compute-cons-map-inv-compute-walk-Directed-Graph e refl-walk-Directed-Graph' = refl compute-cons-map-inv-compute-walk-Directed-Graph e ( snoc-walk-Directed-Graph' w f) = ap ( λ v → snoc-walk-Directed-Graph G v f) ( compute-cons-map-inv-compute-walk-Directed-Graph e w) is-section-map-inv-compute-walk-Directed-Graph : {x y : vertex-Directed-Graph G} → ( map-compute-walk-Directed-Graph {x} {y} ∘ map-inv-compute-walk-Directed-Graph {x} {y}) ~ id is-section-map-inv-compute-walk-Directed-Graph refl-walk-Directed-Graph' = refl is-section-map-inv-compute-walk-Directed-Graph ( snoc-walk-Directed-Graph' w e) = ( compute-snoc-map-compute-walk-Directed-Graph ( map-inv-compute-walk-Directed-Graph w) ( e)) ∙ ( ap ( λ v → snoc-walk-Directed-Graph' v e) ( is-section-map-inv-compute-walk-Directed-Graph w)) is-retraction-map-inv-compute-walk-Directed-Graph : {x y : vertex-Directed-Graph G} → ( map-inv-compute-walk-Directed-Graph {x} {y} ∘ map-compute-walk-Directed-Graph {x} {y}) ~ id is-retraction-map-inv-compute-walk-Directed-Graph refl-walk-Directed-Graph = refl is-retraction-map-inv-compute-walk-Directed-Graph ( cons-walk-Directed-Graph e w) = ( compute-cons-map-inv-compute-walk-Directed-Graph e ( map-compute-walk-Directed-Graph w)) ∙ ( ap ( cons-walk-Directed-Graph e) ( is-retraction-map-inv-compute-walk-Directed-Graph w)) is-equiv-map-compute-walk-Directed-Graph : {x y : vertex-Directed-Graph G} → is-equiv (map-compute-walk-Directed-Graph {x} {y}) is-equiv-map-compute-walk-Directed-Graph = is-equiv-is-invertible map-inv-compute-walk-Directed-Graph is-section-map-inv-compute-walk-Directed-Graph is-retraction-map-inv-compute-walk-Directed-Graph compute-walk-Directed-Graph : (x y : vertex-Directed-Graph G) → walk-Directed-Graph G x y ≃ walk-Directed-Graph' G x y pr1 (compute-walk-Directed-Graph x y) = map-compute-walk-Directed-Graph pr2 (compute-walk-Directed-Graph x y) = is-equiv-map-compute-walk-Directed-Graph ``` ### The type of walks from `x` to `y` is a coproduct ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) where coproduct-walk-Directed-Graph : (x y : vertex-Directed-Graph G) → UU (l1 ⊔ l2) coproduct-walk-Directed-Graph x y = (y = x) + Σ ( vertex-Directed-Graph G) ( λ z → edge-Directed-Graph G x z × walk-Directed-Graph G z y) map-compute-coproduct-walk-Directed-Graph : (x y : vertex-Directed-Graph G) → walk-Directed-Graph G x y → coproduct-walk-Directed-Graph x y map-compute-coproduct-walk-Directed-Graph x .x refl-walk-Directed-Graph = inl refl map-compute-coproduct-walk-Directed-Graph x y ( cons-walk-Directed-Graph {a} {b} {c} e w) = inr (b , e , w) map-inv-compute-coproduct-walk-Directed-Graph : (x y : vertex-Directed-Graph G) → coproduct-walk-Directed-Graph x y → walk-Directed-Graph G x y map-inv-compute-coproduct-walk-Directed-Graph x .x (inl refl) = refl-walk-Directed-Graph map-inv-compute-coproduct-walk-Directed-Graph x y (inr (z , e , w)) = cons-walk-Directed-Graph e w is-section-map-inv-compute-coproduct-walk-Directed-Graph : (x y : vertex-Directed-Graph G) → ( map-compute-coproduct-walk-Directed-Graph x y ∘ map-inv-compute-coproduct-walk-Directed-Graph x y) ~ id is-section-map-inv-compute-coproduct-walk-Directed-Graph x .x (inl refl) = refl is-section-map-inv-compute-coproduct-walk-Directed-Graph x y ( inr (z , e , w)) = refl is-retraction-map-inv-compute-coproduct-walk-Directed-Graph : (x y : vertex-Directed-Graph G) → ( map-inv-compute-coproduct-walk-Directed-Graph x y ∘ map-compute-coproduct-walk-Directed-Graph x y) ~ id is-retraction-map-inv-compute-coproduct-walk-Directed-Graph x .x refl-walk-Directed-Graph = refl is-retraction-map-inv-compute-coproduct-walk-Directed-Graph x y ( cons-walk-Directed-Graph e w) = refl is-equiv-map-compute-coproduct-walk-Directed-Graph : (x y : vertex-Directed-Graph G) → is-equiv (map-compute-coproduct-walk-Directed-Graph x y) is-equiv-map-compute-coproduct-walk-Directed-Graph x y = is-equiv-is-invertible ( map-inv-compute-coproduct-walk-Directed-Graph x y) ( is-section-map-inv-compute-coproduct-walk-Directed-Graph x y) ( is-retraction-map-inv-compute-coproduct-walk-Directed-Graph x y) compute-coproduct-walk-Directed-Graph : (x y : vertex-Directed-Graph G) → walk-Directed-Graph G x y ≃ coproduct-walk-Directed-Graph x y pr1 (compute-coproduct-walk-Directed-Graph x y) = map-compute-coproduct-walk-Directed-Graph x y pr2 (compute-coproduct-walk-Directed-Graph x y) = is-equiv-map-compute-coproduct-walk-Directed-Graph x y ``` ### Walks of length `0` are identifications ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) (x : vertex-Directed-Graph G) where is-torsorial-walk-of-length-zero-Directed-Graph : is-torsorial (λ y → walk-of-length-Directed-Graph G 0 x y) is-torsorial-walk-of-length-zero-Directed-Graph = is-contr-equiv' ( Σ (vertex-Directed-Graph G) (λ y → y = x)) ( equiv-tot (λ y → compute-raise l2 (y = x))) ( is-torsorial-Id' x) ``` ### `cons-walk e w ≠ refl-walk` ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) (x : vertex-Directed-Graph G) where neq-cons-refl-walk-Directed-Graph : (y : vertex-Directed-Graph G) (e : edge-Directed-Graph G x y) → (w : walk-Directed-Graph G y x) → cons-walk-Directed-Graph e w ≠ refl-walk-Directed-Graph neq-cons-refl-walk-Directed-Graph y e w () ``` ### If `cons-walk e w = cons-walk e' w'`, then `(y , e) = (y' , e')` ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) (x : vertex-Directed-Graph G) where eq-direct-successor-eq-cons-walk-Directed-Graph : {y y' z : vertex-Directed-Graph G} (e : edge-Directed-Graph G x y) (e' : edge-Directed-Graph G x y') (w : walk-Directed-Graph G y z) (w' : walk-Directed-Graph G y' z) → cons-walk-Directed-Graph e w = cons-walk-Directed-Graph e' w' → (y , e) = (y' , e') eq-direct-successor-eq-cons-walk-Directed-Graph {y} {.y} {z} e .e w .w refl = refl ``` ### Vertices on a walk ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) where is-vertex-on-walk-Directed-Graph : {x y : vertex-Directed-Graph G} (w : walk-Directed-Graph G x y) (v : vertex-Directed-Graph G) → UU l1 is-vertex-on-walk-Directed-Graph {x} refl-walk-Directed-Graph v = v = x is-vertex-on-walk-Directed-Graph {x} (cons-walk-Directed-Graph e w) v = ( v = x) + ( is-vertex-on-walk-Directed-Graph w v) vertex-on-walk-Directed-Graph : {x y : vertex-Directed-Graph G} (w : walk-Directed-Graph G x y) → UU l1 vertex-on-walk-Directed-Graph w = Σ (vertex-Directed-Graph G) (is-vertex-on-walk-Directed-Graph w) vertex-vertex-on-walk-Directed-Graph : {x y : vertex-Directed-Graph G} (w : walk-Directed-Graph G x y) → vertex-on-walk-Directed-Graph w → vertex-Directed-Graph G vertex-vertex-on-walk-Directed-Graph w = pr1 ``` ### Edges on a walk ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) where data is-edge-on-walk-Directed-Graph : {x y : vertex-Directed-Graph G} (w : walk-Directed-Graph G x y) {u v : vertex-Directed-Graph G} → edge-Directed-Graph G u v → UU (l1 ⊔ l2) where edge-is-edge-on-walk-Directed-Graph : {x y z : vertex-Directed-Graph G} (e : edge-Directed-Graph G x y) (w : walk-Directed-Graph G y z) → is-edge-on-walk-Directed-Graph (cons-walk-Directed-Graph e w) e cons-is-edge-on-walk-Directed-Graph : {x y z : vertex-Directed-Graph G} (e : edge-Directed-Graph G x y) (w : walk-Directed-Graph G y z) → {u v : vertex-Directed-Graph G} (f : edge-Directed-Graph G u v) → is-edge-on-walk-Directed-Graph w f → is-edge-on-walk-Directed-Graph (cons-walk-Directed-Graph e w) f edge-on-walk-Directed-Graph : {x y : vertex-Directed-Graph G} (w : walk-Directed-Graph G x y) → UU (l1 ⊔ l2) edge-on-walk-Directed-Graph w = Σ ( total-edge-Directed-Graph G) ( λ e → is-edge-on-walk-Directed-Graph w (edge-total-edge-Directed-Graph G e)) module _ {x y : vertex-Directed-Graph G} (w : walk-Directed-Graph G x y) (e : edge-on-walk-Directed-Graph w) where total-edge-edge-on-walk-Directed-Graph : total-edge-Directed-Graph G total-edge-edge-on-walk-Directed-Graph = pr1 e source-edge-on-walk-Directed-Graph : vertex-Directed-Graph G source-edge-on-walk-Directed-Graph = source-total-edge-Directed-Graph G total-edge-edge-on-walk-Directed-Graph target-edge-on-walk-Directed-Graph : vertex-Directed-Graph G target-edge-on-walk-Directed-Graph = target-total-edge-Directed-Graph G total-edge-edge-on-walk-Directed-Graph edge-edge-on-walk-Directed-Graph : edge-Directed-Graph G source-edge-on-walk-Directed-Graph target-edge-on-walk-Directed-Graph edge-edge-on-walk-Directed-Graph = edge-total-edge-Directed-Graph G total-edge-edge-on-walk-Directed-Graph is-edge-on-walk-edge-on-walk-Directed-Graph : is-edge-on-walk-Directed-Graph w edge-edge-on-walk-Directed-Graph is-edge-on-walk-edge-on-walk-Directed-Graph = pr2 e ``` ### The action on walks of graph homomorphisms ```agda walk-hom-Directed-Graph : {l1 l2 l3 l4 : Level} (G : Directed-Graph l1 l2) (H : Directed-Graph l3 l4) (f : hom-Directed-Graph G H) {x y : vertex-Directed-Graph G} → walk-Directed-Graph G x y → walk-Directed-Graph H ( vertex-hom-Directed-Graph G H f x) ( vertex-hom-Directed-Graph G H f y) walk-hom-Directed-Graph G H f refl-walk-Directed-Graph = refl-walk-Directed-Graph walk-hom-Directed-Graph G H f (cons-walk-Directed-Graph e w) = cons-walk-Directed-Graph ( edge-hom-Directed-Graph G H f e) ( walk-hom-Directed-Graph G H f w) ``` ### The action on walks of length `n` of graph homomorphisms ```agda module _ {l1 l2 l3 l4 : Level} (G : Directed-Graph l1 l2) (H : Directed-Graph l3 l4) (f : hom-Directed-Graph G H) where walk-of-length-hom-Directed-Graph : (n : ℕ) {x y : vertex-Directed-Graph G} → walk-of-length-Directed-Graph G n x y → walk-of-length-Directed-Graph H n ( vertex-hom-Directed-Graph G H f x) ( vertex-hom-Directed-Graph G H f y) walk-of-length-hom-Directed-Graph zero-ℕ {x} {y} (map-raise p) = map-raise (ap (vertex-hom-Directed-Graph G H f) p) walk-of-length-hom-Directed-Graph (succ-ℕ n) = map-Σ ( λ z → ( edge-Directed-Graph H (vertex-hom-Directed-Graph G H f _) z) × ( walk-of-length-Directed-Graph H n z ( vertex-hom-Directed-Graph G H f _))) ( vertex-hom-Directed-Graph G H f) ( λ z → map-product ( edge-hom-Directed-Graph G H f) ( walk-of-length-hom-Directed-Graph n)) square-compute-total-walk-of-length-hom-Directed-Graph : (x y : vertex-Directed-Graph G) → coherence-square-maps ( tot (λ n → walk-of-length-hom-Directed-Graph n {x} {y})) ( map-compute-total-walk-of-length-Directed-Graph G x y) ( map-compute-total-walk-of-length-Directed-Graph H ( vertex-hom-Directed-Graph G H f x) ( vertex-hom-Directed-Graph G H f y)) ( walk-hom-Directed-Graph G H f {x} {y}) square-compute-total-walk-of-length-hom-Directed-Graph x .x (zero-ℕ , map-raise refl) = refl square-compute-total-walk-of-length-hom-Directed-Graph x y (succ-ℕ n , z , e , w) = ap ( cons-walk-Directed-Graph (edge-hom-Directed-Graph G H f e)) ( square-compute-total-walk-of-length-hom-Directed-Graph z y (n , w)) ``` ### The action on walks of length `n` of equivalences of graphs ```agda equiv-walk-of-length-equiv-Directed-Graph : {l1 l2 l3 l4 : Level} (G : Directed-Graph l1 l2) (H : Directed-Graph l3 l4) (f : equiv-Directed-Graph G H) (n : ℕ) {x y : vertex-Directed-Graph G} → walk-of-length-Directed-Graph G n x y ≃ walk-of-length-Directed-Graph H n ( vertex-equiv-Directed-Graph G H f x) ( vertex-equiv-Directed-Graph G H f y) equiv-walk-of-length-equiv-Directed-Graph G H f zero-ℕ = equiv-raise _ _ ( equiv-ap (equiv-vertex-equiv-Directed-Graph G H f) _ _) equiv-walk-of-length-equiv-Directed-Graph G H f (succ-ℕ n) = equiv-Σ ( λ z → ( edge-Directed-Graph H (vertex-equiv-Directed-Graph G H f _) z) × ( walk-of-length-Directed-Graph H n z ( vertex-equiv-Directed-Graph G H f _))) ( equiv-vertex-equiv-Directed-Graph G H f) ( λ z → equiv-product ( equiv-edge-equiv-Directed-Graph G H f _ _) ( equiv-walk-of-length-equiv-Directed-Graph G H f n)) ``` ### The action of equivalences on walks ```agda module _ {l1 l2 l3 l4 : Level} (G : Directed-Graph l1 l2) (H : Directed-Graph l3 l4) (e : equiv-Directed-Graph G H) where walk-equiv-Directed-Graph : {x y : vertex-Directed-Graph G} → walk-Directed-Graph G x y → walk-Directed-Graph H ( vertex-equiv-Directed-Graph G H e x) ( vertex-equiv-Directed-Graph G H e y) walk-equiv-Directed-Graph = walk-hom-Directed-Graph G H (hom-equiv-Directed-Graph G H e) square-compute-total-walk-of-length-equiv-Directed-Graph : (x y : vertex-Directed-Graph G) → coherence-square-maps ( tot ( λ n → map-equiv ( equiv-walk-of-length-equiv-Directed-Graph G H e n {x} {y}))) ( map-compute-total-walk-of-length-Directed-Graph G x y) ( map-compute-total-walk-of-length-Directed-Graph H ( vertex-equiv-Directed-Graph G H e x) ( vertex-equiv-Directed-Graph G H e y)) ( walk-equiv-Directed-Graph {x} {y}) square-compute-total-walk-of-length-equiv-Directed-Graph x .x (zero-ℕ , map-raise refl) = refl square-compute-total-walk-of-length-equiv-Directed-Graph x y (succ-ℕ n , z , f , w) = ap ( cons-walk-Directed-Graph (edge-equiv-Directed-Graph G H e x z f)) ( square-compute-total-walk-of-length-equiv-Directed-Graph z y (n , w)) is-equiv-walk-equiv-Directed-Graph : {x y : vertex-Directed-Graph G} → is-equiv (walk-equiv-Directed-Graph {x} {y}) is-equiv-walk-equiv-Directed-Graph {x} {y} = is-equiv-right-is-equiv-left-square ( map-equiv ( equiv-tot ( λ n → equiv-walk-of-length-equiv-Directed-Graph G H e n {x} {y}))) ( walk-equiv-Directed-Graph {x} {y}) ( map-compute-total-walk-of-length-Directed-Graph G x y) ( map-compute-total-walk-of-length-Directed-Graph H ( vertex-equiv-Directed-Graph G H e x) ( vertex-equiv-Directed-Graph G H e y)) ( inv-htpy ( square-compute-total-walk-of-length-equiv-Directed-Graph x y)) ( is-equiv-map-compute-total-walk-of-length-Directed-Graph G x y) ( is-equiv-map-compute-total-walk-of-length-Directed-Graph H ( vertex-equiv-Directed-Graph G H e x) ( vertex-equiv-Directed-Graph G H e y)) ( is-equiv-map-equiv ( equiv-tot ( λ n → equiv-walk-of-length-equiv-Directed-Graph G H e n))) equiv-walk-equiv-Directed-Graph : {x y : vertex-Directed-Graph G} → walk-Directed-Graph G x y ≃ walk-Directed-Graph H ( vertex-equiv-Directed-Graph G H e x) ( vertex-equiv-Directed-Graph G H e y) pr1 (equiv-walk-equiv-Directed-Graph {x} {y}) = walk-equiv-Directed-Graph pr2 (equiv-walk-equiv-Directed-Graph {x} {y}) = is-equiv-walk-equiv-Directed-Graph ``` ### If `concat-walk-Directed-Graph u v = refl-walk-Directed-Graph` then both `u` and `v` are `refl-walk-Directed-Graph` ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) where eq-is-refl-concat-walk-Directed-Graph : {x y : vertex-Directed-Graph G} → (u : walk-Directed-Graph G x y) (v : walk-Directed-Graph G y x) → ( concat-walk-Directed-Graph G u v = refl-walk-Directed-Graph) → x = y eq-is-refl-concat-walk-Directed-Graph refl-walk-Directed-Graph .refl-walk-Directed-Graph refl = refl is-refl-left-is-refl-concat-walk-Directed-Graph : {x y : vertex-Directed-Graph G} (u : walk-Directed-Graph G x y) (v : walk-Directed-Graph G y x) → (p : concat-walk-Directed-Graph G u v = refl-walk-Directed-Graph) → tr ( walk-Directed-Graph G x) ( eq-is-refl-concat-walk-Directed-Graph u v p) ( refl-walk-Directed-Graph) = u is-refl-left-is-refl-concat-walk-Directed-Graph refl-walk-Directed-Graph .refl-walk-Directed-Graph refl = refl is-refl-right-is-refl-concat-walk-Directed-Graph : {x y : vertex-Directed-Graph G} (u : walk-Directed-Graph G x y) (v : walk-Directed-Graph G y x) → (p : concat-walk-Directed-Graph G u v = refl-walk-Directed-Graph) → tr ( walk-Directed-Graph G y) ( inv (eq-is-refl-concat-walk-Directed-Graph u v p)) ( refl-walk-Directed-Graph) = v is-refl-right-is-refl-concat-walk-Directed-Graph refl-walk-Directed-Graph .refl-walk-Directed-Graph refl = refl ``` ### The function `unit-walk` is injective ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) where is-injective-unit-walk-Directed-Graph : {x y : vertex-Directed-Graph G} → is-injective (unit-walk-Directed-Graph G {x} {y}) is-injective-unit-walk-Directed-Graph refl = refl ``` ### The last edge on a walk ```agda module _ {l1 l2 : Level} (G : Directed-Graph l1 l2) where last-stage-walk-Directed-Graph : {x y z : vertex-Directed-Graph G} (e : edge-Directed-Graph G x y) → walk-Directed-Graph G y z → Σ (vertex-Directed-Graph G) (λ u → edge-Directed-Graph G u z) last-stage-walk-Directed-Graph e refl-walk-Directed-Graph = (_ , e) last-stage-walk-Directed-Graph e (cons-walk-Directed-Graph f w) = last-stage-walk-Directed-Graph f w vertex-last-stage-walk-Directed-Graph : {x y z : vertex-Directed-Graph G} (e : edge-Directed-Graph G x y) → walk-Directed-Graph G y z → vertex-Directed-Graph G vertex-last-stage-walk-Directed-Graph e w = pr1 (last-stage-walk-Directed-Graph e w) edge-last-stage-walk-Directed-Graph : {x y z : vertex-Directed-Graph G} (e : edge-Directed-Graph G x y) → (w : walk-Directed-Graph G y z) → edge-Directed-Graph G (vertex-last-stage-walk-Directed-Graph e w) z edge-last-stage-walk-Directed-Graph e w = pr2 (last-stage-walk-Directed-Graph e w) walk-last-stage-walk-Directed-Graph : {x y z : vertex-Directed-Graph G} (e : edge-Directed-Graph G x y) → (w : walk-Directed-Graph G y z) → walk-Directed-Graph G x (vertex-last-stage-walk-Directed-Graph e w) walk-last-stage-walk-Directed-Graph e refl-walk-Directed-Graph = refl-walk-Directed-Graph walk-last-stage-walk-Directed-Graph e (cons-walk-Directed-Graph f w) = cons-walk-Directed-Graph e (walk-last-stage-walk-Directed-Graph f w) ``` ## External links - [Path](https://www.wikidata.org/entity/Q917421) on Wikidata - [Path (graph theory)](<https://en.wikipedia.org/wiki/Path_(graph_theory)>) at Wikipedia - [Walk](https://mathworld.wolfram.com/Walk.html) at Wolfram Mathworld