Algebraı̈sche Specificaties We veronderstellen gegeven twee eindige verzamelingen: • datasoorten, genoteerd met s, en • functiesymbolen, genoteerd met f . Ieder functiesymbool f heeft een typering f : s1 × · · · × sn → s. Voorbeeld: Soorten nat en bool. 0 succ add mul : : : : → nat nat → nat nat × nat → nat nat × nat → nat T F and or not : : : : : → bool → bool bool × bool → bool bool × bool → bool bool → bool even : nat → bool odd : nat → bool 2 Signatuur Een signatuur bestaat uit twee eindige verzamelingen: • S van soorten, en • Σ van functiesymbolen, voorzien van een typering: f : s1 × · · · × sn → s c :→ s (oftewel n is 0) heet een constante. Voorbeeld: Stacks. S is {data, stack} Σ bestaat uit: d1, . . . , dn : → data empty : → stack push : data × stack → stack pop : stack → stack top : stack → data error : → data 3 Termen Gegeven een signatuur (S, Σ). X is een S-soortige verzameling (Xs)s∈S van variabelen: • Xs ∩ Xs′ is leeg als s 6≡ s′. • De variabelen in Xs zijn van soort s. Constanten en variabelen zijn termen van eigen soort. Laat f ∈ Σ met f : s1 × · · · × sn → s (en n > 0), en t1, . . . , tn termen van soort s1, . . . , sn. Dan is f (t1, . . . , tn) een term van soort s. De collectie termen wordt genoteerd met Ter Σ(X). 4 Een gesloten term bevat geen variabelen. Anders heet hij open. Voorbeeld: add(succ(x), 0) en mul(0, add(y, z)) zijn open termen. succ(add(0, succ(0))) is een gesloten term. Equationale Specificaties Een vergelijking is van de vorm t=u waarbij t en u termen van dezelfde soort zijn. Een equationele specificatie is een verzameling vergelijkingen. Equationele specificaties van data-types zijn relatief eenvoudig, en executeerbaar als een termherschrijfsysteem. 5 Voorbeeld: Naturals. [N1] add(x, 0) = x [N2] add(x, succ(y)) = succ(add(x, y)) [N3] mul(x, 0) = 0 [N4] mul(x, succ(y)) = add(mul(x, y), x) Een afleiding van één plus één is twee: add(succ(0), succ(0)) = succ(add(succ(0), 0)) = succ(succ(0)) Vraag: Geef een afleiding van mul(succ(0), succ(0)) = succ(0) 6 Vraag: Geef een equationele specificatie voor de Booleans, met als functiesymbolen: T F and or not De specificaties van Naturals en Booleans kunnen tezamen genomen worden tot een gemengde specificatie. Vraag: Specificeer ook even, odd : nat → bool Vraag: Geef een equationele specificatie voor Stacks, met als functiesymbolen: empty push pop top 7 Substituties Laat (S, Σ) een signatuur zijn, en X een Ssoortige verzameling variabelen. Een substitutie is een functie θ : X → Ter Σ(X) waarbij θ(x) steeds een term van dezelfde soort als de variabele x is. Zo’n functie θ kan inductief worden uitgebreid tot een functie θ̄ : Ter Σ(X) → Ter Σ(X): θ̄(x) ≡ θ(x) θ̄(f (t1, . . . , tn)) ≡ f (θ̄(t1), . . . , θ̄(tn)) 8 Afleidbaarheid De uit een equationele specificatie E afleidbare vergelijkingen worden recursief gedefinieerd: (axioma’s) De vergelijkingen in E heten axioma’s en zijn afleidbaar uit E. (reflexiviteit) Elke vergelijking t = t is afleidbaar uit E. (symmetrie) Als t = u afleidbaar is uit E, dan is u = t dat ook. (transitiviteit) Als t1 = t2 en t2 = t3 afleidbaar zijn uit E, dan is t1 = t3 dat ook. (congruentie) Laat t1, . . . , tn van soort s1, . . . , sn zijn, en f : s1 × · · · × sn → s. Als ti = ui voor i ∈ {1, . . . , n} afleidbaar zijn uit E, dan is f (t1, . . . , tn) = f (u1, . . . , un) afleidbaar uit E. (substitutie) Laat θ een substitutie zijn. Als t = u afleidbaar is uit E, dan is θ̄(t) = θ̄(u) ook afleidbaar uit E. 9 E ⊢ t = u noteert dat t = u afleidbaar is uit E. Vraag: Leid uit onderstaande axioma’s af: even(add(succ(succ(0)), succ(0))) = F [N1] add(x, 0) = x [N2] add(x, succ(y)) = succ(add(x, y)) [E1] even(0) = T [E2] even(succ(x)) = odd(x) [E3] odd(0) = F [E4] odd(succ(x)) = even(x) Welke van deze zes axioma’s wordt in bovenstaande afleiding niet gebruikt? Kan add(x, y) = add(y, x) worden afgeleid van axioma’s [N1] en [N2]?