Hallo Community,
ich bräuchte einen Denkanstoß zu folgender Aufgabe:
Gegeben ist die Spezifikation eines Listen-ADTs in List.asl
Ich soll nun noch zwei Funktionen hinzufügen:
- remove: Nat x List -> List
// entfernt an einer Stelle ein Element. Bsp.: remove(2,[5,6,8,42]) = [5,6,42]
- revert: List -> List
// kehrt die Liste um. Bsp.: revert([5,6,8,42]) = [42,8,6,5]
Die Funktionen übernehme ich ja erstmal so wie sie beschrieben sind und schreibe sie unter functions. Also muss ich "nur noch" die equations und variables einfügen.
Bei den equations komme ich aber schon nicht wirklich weiter.
Die equations sollen ja alle Abfragen abdecken. Fehlerfälle müssen nicht reingeschrieben werden. Bis jetzt hatten wir schon mal die Methode "get" hinzugefügt, die eine natürliche Zahl und eine Liste erhält, und dann das Element in der Liste mit dem entsprechenden Index (also die natürliche Zahl) zurück gibt.
Die Funktion hieß: get : Nat x List → Elem?
variables: n: Nat
und die ecuations:
get(zero, cons(e, l)) = e
get(succ(n), cons(e, l)) = get(n, l)
Also falls die natürliche Zahl null ist, geben wir einfach das erste Element zurück, andernfalls geben wir das Element an der Stelle n zurück. Sieht für mich so aus, als würde er rekursiv durchlaufen bis n getroffen wurde.
Bei den jetzigen Funktionen soll ich aber ja nicht einfach irgendwas ausgeben, sondern muss vorher noch etwas verändern. In Java wären die Methoden in zwei Minuten geschrieben aber mir ist die Nummer einfach (achtung Witz) zu abstrakt.
Die Funktionen an sich kann ich ja noch nachvollziehen, da man ja einfach nur die Datentypen die "rein und rausgehen" aufschreibt.
Für die Remove Funktion dachte ich daran die Zahl mit dem entsprechenden Index an das Ende zu setzen und mir dann die Liste ohne "tail" ausgeben zu lassen. Wie ich das aufschreiben soll ist mir aber auch nicht ganz klar.
Wäre super wenn mir jemand helfen könnte
ich bräuchte einen Denkanstoß zu folgender Aufgabe:
Gegeben ist die Spezifikation eines Listen-ADTs in List.asl
specification list
imports
bool
nat
sorts
List
Elem
constructors
nil : -> List // Empty list
cons : Elem x List -> List // Head element and tail list
functions
head : List -> Elem? // Head element
tail : List -> List? // List without head
isNil : List -> Bool // Test for nil list
length : List -> Nat // Number of elements in the list
append : List x List -> List // Append two lists
snoc : List x Elem -> List // Friend of cons
last : List -> Elem? // Last element
init : List -> List? // List without last
variables
e : Elem
l : List
l1 : List
l2 : List
equations
head(cons(e, l)) = e
tail(cons(e, l)) = l
isNil(nil) = true
isNil(cons(e, l)) = false
length(nil) = zero
length(cons(e, l)) = succ(length(l))
append(nil, l) = l
append(cons(e, l1), l2) = cons(e, append(l1, l2))
snoc(l, e) = append(l, cons(e, nil))
last(cons(e,l)) = if isNil(l) then e else last(l)
init(cons(e,l)) = if isNil(l) then nil else cons(e, init(l))
Ich soll nun noch zwei Funktionen hinzufügen:
- remove: Nat x List -> List
// entfernt an einer Stelle ein Element. Bsp.: remove(2,[5,6,8,42]) = [5,6,42]
- revert: List -> List
// kehrt die Liste um. Bsp.: revert([5,6,8,42]) = [42,8,6,5]
Die Funktionen übernehme ich ja erstmal so wie sie beschrieben sind und schreibe sie unter functions. Also muss ich "nur noch" die equations und variables einfügen.
Bei den equations komme ich aber schon nicht wirklich weiter.
Die equations sollen ja alle Abfragen abdecken. Fehlerfälle müssen nicht reingeschrieben werden. Bis jetzt hatten wir schon mal die Methode "get" hinzugefügt, die eine natürliche Zahl und eine Liste erhält, und dann das Element in der Liste mit dem entsprechenden Index (also die natürliche Zahl) zurück gibt.
Die Funktion hieß: get : Nat x List → Elem?
variables: n: Nat
und die ecuations:
get(zero, cons(e, l)) = e
get(succ(n), cons(e, l)) = get(n, l)
Also falls die natürliche Zahl null ist, geben wir einfach das erste Element zurück, andernfalls geben wir das Element an der Stelle n zurück. Sieht für mich so aus, als würde er rekursiv durchlaufen bis n getroffen wurde.
Bei den jetzigen Funktionen soll ich aber ja nicht einfach irgendwas ausgeben, sondern muss vorher noch etwas verändern. In Java wären die Methoden in zwei Minuten geschrieben aber mir ist die Nummer einfach (achtung Witz) zu abstrakt.
Die Funktionen an sich kann ich ja noch nachvollziehen, da man ja einfach nur die Datentypen die "rein und rausgehen" aufschreibt.
Für die Remove Funktion dachte ich daran die Zahl mit dem entsprechenden Index an das Ende zu setzen und mir dann die Liste ohne "tail" ausgeben zu lassen. Wie ich das aufschreiben soll ist mir aber auch nicht ganz klar.
Wäre super wenn mir jemand helfen könnte