# Blatt 5
Lukas Bruns
Robin Faeseke
Aufgabe 1
1.
not(true) = false
not(false) = true
2.
a)
Gilt, da succ(succ(succ(zero)))= zero nach Axiomen. Daher folgt succ(succ(succ(succ(zero)))) = succ(zero) wenn man den Teil nach dem ersten succ mit dem Axiom ersetzt.
b)
Sei succ(zero) = m und zero = n, dann folgt:
mult(succ(succ(zero)),zero) = zero
⇔
mult(succ(m),n) = zero
⇔
add(mult(succ(zero),n),n) = zero
⇔
add(add(mult(zero,n),n),n) = zero
⇔
add(add(zero,n),n) = zero
⇔
add(zero,n) = zero
⇔
n = zero
Und das ist eine wahre Aussage.
c)
iszero(add(succ(succ(zero)), succ(zero))) = false
⇔
iszero(succ(add(succ(zero),succ(zero)))) = false
⇔
iszero(succ(succ(add(zero,succ(zero))))) = false
⇔
iszero(succ(succ(succ(zero)))) = false
⇔
iszero(zero) = false
⇔
true = false
Also ist die Aussage falsch.
3.
Modulo 3, erkennbar an der succesor Spezifikation.
4.
n,m,z ∈ ℕ0
b ∈ B
iszero^ℳ = n -> b : {n -> true, falls n = zero
n-> false, falls n ≠ zero}
add^ℳ = ℕ0> : {n,m -> succ(n), falls m = succ(zero)
n,m -> succ(add(n,z)), falls m = succ(z) und m≠ succ(zero) }
mult^ℳ =ℕ0*ℕ0 -> ℕ0: {n,m -> n, falls m = succ(zero)
n,m -> add(mult(n,z)), falls m = succ(z) und m≠succ(zero) }
succ^ℳ = ℕ0 -> ℕ0:{n-> n+1 }
5.
Ja es gilt das Erzeugerprinzip, weil alle in mNat befindlichen Elemente mit einer endlichen Anzahl an Operationen dargestellt werden können.
Aufgabe 2
Die Funktion intersect gibt die Menge zurück, welche in den beiden übergebenen Mengen übereinstimmt. Also die Schnittmenge der beiden übergebenen Mengen.
Dabei geben die Axiome intersect(emptyset,s*)= emptyset und intersect(s, emptyset) = emptyset jeweils an, dass die Schnittmenge mit der leeren Menge wieder die leere Menge ergibt.
Das Axiom intersect(add(s,n), add(s',n)) = add(intersect(s,s'),n) besagt, dass das hinzufügen eines Elements auf beiden Stacks und danach die Bildung der Schnittmenge das gleiche ist wie die Schnittmenge der beiden Stacks mit dem Element n zu bilden.
Das letzte Axiom unter der Bedingung n ≠ n besagt, dass die Schnittmenge aus dem oberen Fall das gleiche ist wie die Vereinigung der jeweiligen Schnittmengen.
Aufgabe 3
spec NatArray = Bool and Nat then
sorts
array = empty | set(array,nat, nat)
ops
set: (array,nat,nat) array
defined: (array, nat) bool
get: (array, nat) nat
remove: (array, nat) array
merge: (array, array) array
sum: (array) nat
vars
a, a': array
x,y,z: nat
axioms
set(remove(a,x),x,get(a,x)) = a
defined(empty,x) = false
defined(set(a,x,y), x) = true
get(empty,x) = undefined
get(set(a,x,y), x) = y
remove(empty,x) = empty
remove(a,x) = undefined
merge(set(a,y,z),set(a',y,x)) = set(a,y,z)
sum(add(get(a,x), get(a,succ(x)))) = a'