Advertisement
Guest User

Untitled

a guest
Aug 20th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.23 KB | None | 0 0
  1. fmod LAMBDA is pr NAT . pr QID .
  2.  
  3. *** User-level lambda expressions, using named binders.
  4. sorts Expr EName .
  5. subsort Nat EName < Expr .
  6. subsort Qid < EName .
  7. op __ : Expr Expr -> Expr [ctor] .
  8. op [\_._] : EName Expr -> Expr [ctor] .
  9. op let_:=_in_ : EName Expr Expr -> Expr .
  10. eq let X := A in B = [\ X . B ] A .
  11.  
  12. vars X Y : EName .
  13. vars Q Q' : Qid .
  14. var N : Nat .
  15. vars A B : Expr .
  16. vars C C' D D' : DeBruijn .
  17. var Sc : Scope .
  18.  
  19. *** To keep a list of the variable names in scope, innermost at the head.
  20. sort Scope .
  21. op empty : -> Scope [ctor] .
  22. op __ : Scope EName -> Scope [ctor] .
  23. op idx : EName Scope ~> Nat .
  24. eq idx(X, Sc) = idx#(0, X, Sc) .
  25. op idx# : Nat EName Scope ~> Nat .
  26. eq idx#(N, X, Sc X) = N .
  27. ceq idx#(N, X, Sc Y) = idx#(s N, X, Sc) if X =/= Y .
  28.  
  29. *** A nameless lambda representation which uses the distance from the
  30. *** variable to the binding lambda.
  31. sorts DeBruijn DName .
  32. subsort Nat DName < DeBruijn .
  33. op f : Qid -> DName [ctor] . *** Free variables
  34. op b : Nat -> DName [ctor] . *** Bound variables
  35. op d[__] : DeBruijn DeBruijn -> DeBruijn [ctor] .
  36. op d[\._] : DeBruijn -> DeBruijn [ctor] .
  37.  
  38. *** Convert named variable expressions to nameless.
  39. op debruijn : Expr -> DeBruijn .
  40. eq debruijn(A) = debruijn#(empty, A) .
  41. op debruijn# : Scope Expr -> DeBruijn .
  42. eq debruijn#(Sc, N) = N .
  43. ceq debruijn#(Sc, X) = b(N) if N := idx(X, Sc) .
  44. eq debruijn#(Sc, X) = f(X) [owise] .
  45. eq debruijn#(Sc, A B) = d[debruijn#(Sc, A) debruijn#(Sc, B)] .
  46. eq debruijn#(Sc, [\ X . A]) = d[\. debruijn#(Sc X, A)] .
  47.  
  48. *** Bindings defined outside of the reducing expression (named identifiers).
  49. sort FreeCtx .
  50. op none : -> FreeCtx [ctor] .
  51. op _as_ : Qid DeBruijn -> FreeCtx [ctor] .
  52. op _;_ : FreeCtx FreeCtx -> FreeCtx [ctor comm assoc id: none] .
  53.  
  54. *** Bindings introduced from lambdas in the expression.
  55. sort BoundCtx . subsort DeBruijn < BoundCtx .
  56. op none : -> BoundCtx [ctor] .
  57. op _;_ : BoundCtx BoundCtx -> BoundCtx [ctor assoc id: none] .
  58.  
  59. *** Do beta substitution to reduce a nameless expression to its normal form.
  60. var Free : FreeCtx . var Bound : BoundCtx .
  61. op _|=_ : FreeCtx Expr ~> DeBruijn .
  62. eq Free |= A = eval#(Free, none, debruijn(A)) .
  63. op eval# : FreeCtx BoundCtx DeBruijn ~> DeBruijn .
  64. eq eval#(Free, Bound, N) = N .
  65. eq eval#(Free, Bound, d[\. C]) = d[\. C] .
  66. eq eval#(Free, Bound ; C, b( 0)) = eval#(Free, Bound ; C, C) .
  67. eq eval#(Free, Bound ; C, b(s N)) = eval#(Free, Bound, b(N)) .
  68. eq eval#(Free ; Q as C, Bound, f( Q)) = eval#(Free ; Q as C, Bound, C) .
  69. eq eval#(Free, Bound, f( Q)) = Q [owise] .
  70. ceq eval#(Free, Bound, d[C D]) = eval#(Free, Bound ; D', C')
  71. if d[\. C'] := eval#(Free, Bound, C) /\ D' := eval#(Free, Bound, D) .
  72.  
  73. endfm
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement