-- Lecture 4 : Example 3: Associativity of @ -- page 19 mod! BASIC-LIST(X :: TRIV) { [Empty NeList < List] op nil : -> Empty op _::_ : Elt List -> NeList } view t2n from TRIV to NAT{ sort Elt -> Nat } select BASIC-LIST(t2n) parse 0 :: 1 :: 2 :: nil . -- page 20 mod! LIST-@ { pr(BASIC-LIST) op _@_ : List List -> List var E : Elt . vars L1 L2 : List . eq nil @ L1 = L1 . eq (E :: L1) @ L2 = E :: (L1 @ L2) . } select LIST-@(t2n) set trace whole on red (0 :: 1 :: nil) @ (2 :: 3 :: nil) . set trace whole off -- page 21 -- BAD proof score for assoc of @ open LIST-@ + EQL . vars A B : List op l : -> List . var E : Elt . red (A @ B) @ nil = A @ (B @ nil) . eq (A @ B) @ l = A @ (B @ l) . red (A @ B) @ (E :: l) = A @ (B @ (E :: l)) . close -- GOOD proof score for assoc of @ open LIST-@ + EQL . vars B C : List op l : -> List . var E : Elt . red (nil @ B) @ C = nil @ (B @ C) . eq (l @ B) @ C = l @ (B @ C) . red ((E :: l) @ B) @ C = (E :: l) @ (B @ C) . close -- page 22 mod! LIST-@-assoc { pr(LIST-@) op _@_ : List List -> List {assoc} } select LIST-@-assoc(t2n) . red (1 :: nil) @ (2 :: nil) @ (3 :: nil) @ (4 :: nil) .