<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="../../../unit.xsl"?>
<KIVSPEC name="path"><SPECBODY>enrich <a href="../../../specs/path-basic/export/unit.xml">path-basic</a> with comment: This specification gives various functions on paths.;
   
   functions 
       . .last : path → V; comment: the last node of a path;
       . .butlast : path → path; comment: specified for  paths which are not nodes: the path without the last step;
       . + . : path × path → path; comment: replaces the last element of first path with full second path. 
                   Used to append paths, when the last element of first path is first of second;
       . to . : path × nat → path; comment: for n ≤ # pa  the first n  steps of path;
       . from . : path × nat → path; comment: for n ≤ # pa the path with the first n steps cut off. ;
      . [ . ] : path × nat → V; comment: for n ≤ # pa the pa[n] is the nth node of path ;
      . [ . ]i : path × nat → J; comment: for n &lt; # pa  pa[n]i is the nth input on  path ;
      . [ . ]o : path × nat → P; comment: for n &lt; # pa  pa[n]o is the nth input on  path ;
      Step : path × nat → path; comment: one step path of step n;
   predicates 
      Path : path;
      MPath : path;
      FPath : path;
      BPath : path;
   variables 
      j0 : J; 
      p0 : P; 
      v0, v' : V; 
   
   axioms 
      to-base :  ⊦ pa to 0 = pa .first '; used for : ls, s;
      to-rec-base :  ⊦ v ' to (n + 1) = v '; used for : ls, s;
      to-rec-rec :  ⊦ mkpa(v, j, p, pa) to (n + 1) = mkpa(v, j, p, pa to n); used for : ls, s;
      from-base :  ⊦ pa from 0 = pa; used for : ls, s;
      from-rec-base :  ⊦ v ' from (n + 1) = v '; used for : ls, s;
      from-rec-rec :  ⊦ mkpa(v, j, p, pa) from (n + 1) = pa from n; used for : ls, s;
      getv-base :  ⊦ pa[0] = pa .first; used for : s, ls;
      getv-rec :  ⊦ (mkpa(v, j, p, pa)[n + 1]) = pa[n]; used for : s, ls;
      geti-base :  ⊦ (mkpa(v, j, p, pa)[0]i) = j; used for : s, ls;
      geti-rec :  ⊦ (mkpa(v, j, p, pa)[n + 1]i) = pa[n]i; used for : s, ls;
      geto-base :  ⊦ (mkpa(v, j, p, pa)[0]o) = p; used for : s, ls;
      geto-rec :  ⊦ (mkpa(v, j, p, pa)[n + 1]o) = pa[n]o; used for : s, ls;
      butlast-base :  ⊦ mkpa(v, j, p, v0 ') .butlast = v '; used for : s, ls;
      butlast-rec :  ⊦ mkpa(v, j, p, mkpa(v0, j0, p0, pa)) .butlast = mkpa(v, j, p, mkpa(v0, j0, p0, pa) .butlast); used for : s, ls;
      append-base :  ⊦ v ' + pa = pa; used for : s, ls;
      append-rec :  ⊦ mkpa(v, j, p, pa) + pa0 = mkpa(v, j, p, pa + pa0); used for : s, ls;
      last-base :  ⊦ v ' .last = v; used for : s, ls;
      last-rec :  ⊦ mkpa(v, j, p, pa) .last = pa .last; used for : s, ls;
      Path-base :  ⊦ Path(v '); used for : s, ls;
      Path-rec :  ⊦ Path(mkpa(v, j, p, pa)) ↔ (∃ ρ. St(ρ)(v, j, p, pa .first) ∧ Path(pa)); used for : s, ls;
      FPath-def :  ⊦ FPath(pa) ↔ Path(pa) ∧ init(pa .first); used for : s, ls;
      BPath-def :  ⊦ BPath(pa) ↔ Path(pa) ∧ final(pa .last); used for : s, ls;
      MPath-def :  ⊦ MPath(pa) ↔ Path(pa) ∧ init(pa .first) ∧ final(pa .last); used for : s, ls;
      Step-base :  ⊦ Step(mkpa(v, j, p, pa), 0) = mkpa(v, j, p, pa .first '); used for : ls, s;
      Step-rec :  ⊦ Step(mkpa(v, j, p, pa), n + 1) = Step(pa, n); used for : ls, s;
   
end enrich</SPECBODY></KIVSPEC>
