Вы находитесь на странице: 1из 11

Resoluo de expresses

=======================
Dado o axioma
(d) removeLast (addFirst (L, E)) =
(1) L when isEmpty (L)
(2) else addFirst (removeLast (L), E);
onde os (d,1,2) so apenas etiquetas para orientao, a resoluo de removeLast ([a,b,c]) ser
(para simplificar utiliza-se"rl" para "removeLast" e "af" para "addFirst")

rl([a,b,c])=
(d) rl(af([b,c],a))= // desconstruo da lista [a,b,c]
(2) af(rl([b,c]),a)= // aplicao de (2)
(d) af(rl(af([c],b)),a)= // desconstruo da lista [b,c]
(2) af(af(rl([c]),b),a)= // aplicao de (2)
(d) af(af(rl(af([],c)),b),a)= // desconstruo da lista [c]
(1) af(af([],b),a)= // aplicao de (1) - no h mals ocorrnclas de rl(...)"
af([b],a)= // construo do resultado
[a,b] // construo do resultado

Em resumo, a resoluo duma operao ser uma sequncia de pares de "desconstruo" de
argumentos e "aplicao de axioma, seguidos duma sequncia de "construo" do resultado.
(C) 2013 Mrio Guimares, FCUL 1
domains
...



observers
operacao1: List int Element -->? List;
operacao2: List int -->? Element;

axioms
L: List; I: int; E,F: Element;
operacao1 (addFirst (L, E), I, F) =
addFirst (L, F) when I = 0
else addFirst (operacao1 (L, I - 1, F), E);

operacao2 (addFirst (L, E), I) =
E when I = 0
else operacao2 (L, I - 1);

3.1 (c)
(C) 2013 Mrio Guimares, FCUL 2
domains
...



observers
operacao1: List int Element -->? List;
operacao2: List int -->? Element;

axioms
L: List; I: int; E,F: Element;
operacao1 (addFirst (L, E), I, F) =
addFirst (L, F) when I = 0
else addFirst (operacao1 (L, I - 1, F), E);

operacao2 (addFirst (L, E), I) =
E when I = 0
else operacao2 (L, I - 1);

3.1 (c)
operacao1: esta operao aplicada a uma
lista, um nmero, e um elemento, retorna
a lista com esse elemento na posio dada
pelo nmero na lista de entrada

operacao2: esta operao aplicada a uma
lista e um nmero, retorna o elemento na
posio dada pelo nmero na lista de
entrada
(C) 2013 Mrio Guimares, FCUL 3
domains
...



observers
set: List int Element -->? List;
get: List int -->? Element;

axioms
L: List; I: int; E,F: Element;
set (addFirst (L, E), I, F) =
addFirst (L, F) when I = 0
else addFirst (set (L, I - 1, F), E);

get (addFirst (L, E), I) =
E when I = 0
else get (L, I - 1);

3.1 (c)
set: esta operao aplicada a uma lista, um
nmero, e um elemento, retorna a lista
com esse elemento na posio dada pelo
nmero na lista de entrada

get: esta operao aplicada a uma lista e
um nmero, retorna o elemento na
posio dada pelo nmero na lista de
entrada
(C) 2013 Mrio Guimares, FCUL 4
domains
L: List; I: int; E: Element;
set (L, I, E) if 0 <= I and I < size(L);
get (L, I) if 0 <= I and I < size(L);

observers
set: List int Element -->? List;
get: List int -->? Element;

axioms
L: List; I: int; E,F: Element;
set (addFirst (L, E), I, F) =
addFirst (L, F) when I = 0
else addFirst (set (L, I - 1, F), E);

get (addFirst (L, E), I) =
E when I = 0
else get (L, I - 1);

3.1 (c)
set: esta operao aplicada a uma lista, um
nmero, e um elemento, retorna a lista
com esse elemento na posio dada pelo
nmero na lista de entrada

get: esta operao aplicada a uma lista e
um nmero, retorna o elemento na
posio dada pelo nmero na lista de
entrada
(C) 2013 Mrio Guimares, FCUL 5
refinement
Element is class Object

List is class datatypes.list.SingleLinkedList {
make: --> List is SingleLinkedList();
addFirst: List e:Element --> List is void addFirst(Object e);
getFirst: List -->? Element is Object getFirst();
removeFirst: List -->? List is void removeFirst();
isEmpty: List is boolean isEmpty();
size: List --> int is int size();
set: List i:int e:Element -->? List is void set(int i, Object e);
get: List i:int -->? Element is Object get(int i);
addLast: List e:Element --> List is void addLast(Object e);
getLast: List -->? Element is Object getLast();
removeLast: List -->? List is void removeLast();
}
end refinement
3.1 (e)
(C) 2013 Mrio Guimares, FCUL 6
refinement
Element is class Object

List is class datatypes.list.SingleLinkedList {
make: --> List is SingleLinkedList();
addFirst: List e:Element --> List is void addFirst(Object e);
getFirst: List -->? Element is Object getFirst();
removeFirst: List -->? List is void removeFirst();
isEmpty: List is boolean isEmpty();
size: List --> int is int size();
set: List i:int e:Element -->? List is void set(int i, Object e);
get: List i:int -->? Element is Object get(int i);
addLast: List e:Element --> List is void addLast(Object e);
getLast: List -->? Element is Object getLast();
removeLast: List -->? List is void removeLast();
}
end refinement
3.1 (e)
(C) 2013 Mrio Guimares, FCUL 7
Object.equals()
Compara se dois objetos so iguais quanto s propriedades visveis pelo cliente
public class A {
private int v;
private B b;
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof A))
return false;
A other = (A) obj;
return v == other.v
&& b.equals(other.b);
}
}
public class B {
private String s;
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof B))
return false;
B other = (B) obj;
return s.equals(other.s);
}
}
Usar instanceof ou getClass() ?
roprledades: 8eflexlvldade, lmeLrla, 1ranslLlvldade, ConslsLncla, != null"
(C) 2013 Mrio Guimares, FCUL 1
Object.clone()
Permite criar uma cpia dum objecto com os mesmos valores nos atributos
public class A implements Cloneable {
private int value;
public A(int v) { value = v; }
@Override
public A clone() {
try {
return (A) super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e.getMessage());
}
}
}
public class B {
void foo() {
A a1 = new A(10);
A a2 = a1.clone();
}
}
O objecto original e a sua cpia tem de ser independentes para que
alteraes num no se repercutam inadvertidamente no outro!
(C) 2013 Mrio Guimares, FCUL 2
O mtodo Object.clone() ser chamado via super.clone() para criar a classe do clone
super.clone() copia os valores dos atributos do original para o clone
Se um atributo referenciar um objeto mutvel ento este dever tambm ser clonado
public class C implements Cloneable {
private Point p;
private Counter c;
public C() { c = new Counter(); }
public int inc() { return c.inc(); }
@Override
public A clone() {
try {
A theClone = (A) super.clone();
theClone.c = c.clone();
return theClone;
} catch (CloneNotSupportedException e) {
throw new InternalError(e.getMessage());
}
}
}
public class Counter
implements Cloneable {
private int count;
public int inc() {
return ++count;
} ....
}
public class Point {
private int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() { ... }
public int getY() { ... }
}
Object.clone()
(C) 2013 Mrio Guimares, FCUL 3
public class Counter implements Cloneable {
private int count;

public int inc() {
return ++count;
}

@Override
public Counter clone() {
try {
return (Counter) super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e.getMessage());
}
}

}
Object.clone()
(C) 2013 Mrio Guimares, FCUL 4

Оценить