//--------------------------------------------//
// Especificacion Algebraica TAD Secuencia //
// Autor: Pablo Sanchez (p.sanchez@unican.es) //
// http://personales.unican.es/sanchezbp //
//--------------------------------------------//

espec Sequence (List)

usa Boolean, Natural, Entero

generos Sequence(Element) como Seq

parametro
generos Element como E
operaciones
equal: Element Element -> Boolean
variables
x, y, z : Element;
ecuaciones
equal(x,x) = TRUE
equal(x,y) = equal(y,x)
[equal(x,y) and equal(y,z)] equal(x,z) = TRUE;
fparametro

operaciones
emptySeq : -> Seq
addTail : Seq E -> Seq
addHead : Seq E -> Seq
add : Seq E Natural -> Seq
getTail : Seq -> E
getHead : Seq -> E
get : Seq Natural -> E
replace : Seq Natural E -> Seq
removeAll : Seq E -> Seq
removeFirst : Seq E -> Seq
removeLast : Seq E -> Seq
remove : Seq Natural -> Seq
contains : Seq E -> Boolean
findFirstIndex : Seq E -> Entero
findLastIndex : Seq E -> Entero
size : Seq -> Natural
number : Seq E -> Natural
isEmpty : Seq -> Boolean
concat : Seq Seq -> Seq
equal : Seq Seq -> Boolean
subseq : Seq Seq -> Boolean
vars
s, s2 : Seq; n : Natural; x, y : Element;

precondiciones
[0 <= n <= size(s)] add(s,n)
[isEmpty(s) == FALSE] getTail(s), getHead(s)
[0 <= n < size(s)] get(s,n), remove(s,n), replaces(s,n,x)

ecuaciones
// Las generadoras son emptySeq y addTail y son libres
// Los patrones del tipo son:
// - emptySeq
// - addTail(s,x)

addHead(emptySeq,x) = addTail(emptySeq,x)
addHead(addTail(s,x),y) = addTail(addHead(s,y),x)

size(emptySeq) = 0
size(addTail(s,x)) = 1 + size(s)

add(emptySeq,x,0) = addTail(emptySeq,x)
[n == size(addTail(s,x))]
add(addTail(s,x),y,n) = addTail(addTail(s,x),y)
[n < size(addTail(s,x))]
add(addTail(s,x),y,n) = addTail(add(s,y,n),x)

getTail(addTail(s,x)) = x

getHead(addTail(emptySeq,x)) = x
getHead(addTail(addTail(s,x))) = getHead(addTail(s,x))

[n == (size(s) - 1)] get(addTail(s,x),n) = x
[n < (size(s) - 1)] get(addTail(s,x),n) = get(s,n-1)

removeAll(emptySeq,x) = emptySeq
[equal(x,y) == TRUE]
removeAll(addTail(s,x),y) = removeAll(s,y)
[equal(x,y) != TRUE]
removeAll(addTail(s,x),y) = addTail(removeAll(s,y),x)

[n == (size(s) - 1)]
remove(addTail(s,x),n) = s
[n < (size(s) - 1)]
remove(addTail(s,x),n) = addTail(remove(s,n),x)

replace(s,n,y) = add(remove(s,n),y,n)

contains(emptySeq,x) = FALSE
[equal(x,y) == TRUE]
contains(addTail(s,x),y) = TRUE
[equal(x,y) != TRUE]
contains(addTail(s,x),y) = contains(s,y)

findLastIndex(emptySeq,x) = -1
// NOTA: en la funci�n de arriba, en lugar de -1
// podr�a devolverse cualquier valor no v�lido
[(equal(x,y) == TRUE)]
findLastIndex(addTail(s,x),y) = size(s);
[(equal(x,y) != TRUE)]
findLastIndex(addTail(s,x),y) = findLastIndex(s,y);

findFirstIndex(emptySeq,x) = -1
[(equal(x,y) != TRUE)]
findFirstIndex(addTail(s,x),y) = findFirstIndex(s,y);
[(equal(x,y) == TRUE) and (contains(s,y) == TRUE)]
findFirstIndex(addTail(s,x),y) = findFirstIndex(s,y);
[(equal(x,y) == TRUE) and (contains(s,y) != TRUE)]
findFirstIndex(addTail(s,x),y) = size(s);


[findFirstIndex(s,x) != -1]
removeFirst(s,x) = remove(s,findFirstIndex(s,x));
[findFirstIndex(s,x) == -1]
removeFirst(s,x) = s;

[findLastIndex(s,x) != -1]
removeLast(s,x) = remove(s,findLastIndex(s,x));
[findLastIndex(s,x) == -1]
removeLast(s,x) = s;

number(emptySeq,x) = 0
[equal(x,y) == TRUE]
number(addTail(s,x),y) = 1 + number(s,y)
[equal(x,y) != TRUE]
number(addTail(s,x),y) = number(s,y)

isEmpty(emptySeq) = TRUE
isEmpty(addTail(s,x)) = FALSE

concat(s,emptySeq) = s
concat(s,addTail(s2,x)) = addTail(concat(s,s2),x)

equal(emptySeq,emptySeq) = TRUE
equal(addTail(s,x),emptySeq) = FALSE
equal(emptySeq,addTail(s,x)) = FALSE
[equal(x,y) == TRUE]
equal(addTail(s,x),addTail(s2,y)) = equal(s,s2)
[equal(x,y) != TRUE]
equal(addTail(s,x),addTail(s2,y)) = FALSE

subseq(emptySeq,emptySeq) = TRUE
subseq(addTail(s,x),emptySeq) = FALSE
subseq(emptySeq,addTail(s,x)) = TRUE
[size(s) == size(s2)]
subseq(addTail(s,x),addTail(s2,y)) =
and(equal(x,y),equal(s,s2))
[size(s) > size(s2)]
subseq(addTail(s,x),addTail(s2,y)) = FALSE
[size(s) < size(s2)]
subseq(addTail(s,x),addTail(s2,y)) =
subseq(addTail(s,x),s2)

fespec

Última modificación: viernes, 26 de mayo de 2017, 11:17