Pascal Schärli 09.10.2020
public String toString() {
String s="[";
for (int i=0; i<numbers.length; i++) {
if (i!=0) {
s = s + ", ";
}
s = s + numbers[i];
}
s = s + "]";
return s;
}
Pascal Schärli 09.10.2020
private void recursiveSort(int until) {
if (until == 0) {
return;
} else {
recursiveSort(until - 1);
int index_max = until-1;
for (int i=until; i<numbers.length; i++) {
if (numbers[i] > numbers[index_max]) {
index_max = i;
}
}
swap(until - 1, index_max);
}
}
Pascal Schärli 09.10.2020
private static void checkTree(char[] array) throws IllegalArgumentException
{
if(array.length==0)
throw new IllegalArgumentException("empty tree");
for(int i=0;i<array.length;i++) {
if((array[i]!=' ')&&(array[father(i)]==' '))
throw new IllegalArgumentException("empty father");
}
}
Pascal Schärli 09.10.2020
private String toString(int node, String indentation){
String res="";
if(tree[node]==' ')
return "";
// add the first one to the node
res=indentation+Character.toString(tree[node])+"\n";
//Check if the child node is still inside
if(leftChild(node)<tree.length&&leftChild(node)!=' ') {
res=res+toString(leftChild(node),indentation+" ");
}
//also check if there is a right child
if((rightChild(node)<tree.length)&&(rightChild(node)!=' ')) {
res=res+toString(rightChild(node),indentation+" ");
}
return res;
}
Pascal Schärli 09.10.2020
Pascal Schärli 09.10.2020
Pascal Schärli 09.10.2020
String myString = "hello";
myString = myString + " world";
StringBuffer myStringBuffer = "hello";
myStringBuffer.append(" world");
"hello"
" world"
"hello world"
"hello"
" world"
"hello world"
Pascal Schärli 09.10.2020
String myString = "hello";
myString = myString+" world";
myString = myString+" how";
myString = myString+" are";
myString = myString+" you";
myString = myString+" today";
"hello"
" world"
"hello world"
" how"
"hello world how"
"hello world how are"
" you"
"hello world how are you"
" are"
Pascal Schärli 09.10.2020
String myString = "hello";
myString = myString+" world";
myString = myString+" how";
myString = myString+" are";
myString = myString+" you";
myString = myString+" today";
"hello world how are you"
" today"
"hello world how are you today"
Pascal Schärli 09.10.2020
static int divide(int in, int div){
assert(in >= 0 && div >= 0);
int n = in;
int out = 0;
// [Vor Schleife]
while(n >= div){
// [Vor Schleifenkörper]
out += 1;
n -= div;
// [Nach Schleifenkörper]
}
// [Nach Schleife]
return out;
}
Schleifeninvarianten sind ein Weg um die Korrektheit einer Funktion zu beweisen.
Definition:
Schleife
Schleifen Körper
Pascal Schärli 09.10.2020
Programmverifikation
Pascal Schärli - PVK Informatik II 2020
Schleifen Körper
Schleife
Definition:
Schleifeninvarianten sind ein Weg um die Korrektheit einer Funktion zu beweisen.
static int f(int i, int j) {
assert(i >= 0 && j >= 0);
int u = i;
int z = 0;
// [Vor Schleife]
while (u > 0){
// [Vor Schleifenkörper]
z = z + j;
u = u - 1;
// [Nach Schleifenkörper]
}
// [Nach Schleife]
return z;
}
1. Beweise, dass dies eine korrekte Scheifeninvariante ist:
in = n + out * div && n >= 0 && (in - n) % div = 0
static int divide(int in, int div){
assert(in >= 0 && div >= 0);
int n = in;
int out = 0;
// [Vor Schleife]
while(n >= div){
// [Vor Schleifenkörper]
out += 1;
n -= div;
// [Nach Schleifenkörper]
}
// [Nach Schleife]
return out;
}
Vor Schleifenkörper
\(in = n_n + out_n \cdot div\)
&& \( n_n >=0\)
&& \((in - n_n) \% div = 0\)
Nach Schleifenkörper
(Schleifeninvariante)
(Sonst wären wir nicht in den while-loop gekommen)
\(\Rightarrow\) Schleifeninvariante gilt auch nach Schleifenkörper
Pascal Schärli 09.10.2020
1. Beweise, dass dies eine korrekte Scheifeninvariante ist:
in = n + out * div && n >= 0 && (in - n) % div = 0
static int divide(int in, int div){
assert(in >= 0 && div >= 0);
int n = in;
int out = 0;
// [Vor Schleife]
while(n >= div){
// [Vor Schleifenkörper]
out += 1;
n -= div;
// [Nach Schleifenkörper]
}
// [Nach Schleife]
return out;
}
Vor Schleifenkörper
\(in = n_n + out_n \cdot div\)
&& \( n_n >=0\)
&& \((in - n_n) \% div = 0\)
Nach Schleifenkörper
(Schleifeninvariante)
(Sonst wären wir nicht in den while-loop gekommen)
\(\Rightarrow\) Schleifeninvariante gilt auch nach Schleifenkörper
Pascal Schärli 09.10.2020
2. Zeige, dass die Schleifeninvariante vor der Schleife gilt
in = n + out * div && n >= 0 && (in - n) % div = 0
static int divide(int in, int div){
assert(in >= 0 && div >= 0);
int n = in;
int out = 0;
// [Vor Schleife]
while(n >= div){
// [Vor Schleifenkörper]
out += 1;
n -= div;
// [Nach Schleifenkörper]
}
// [Nach Schleife]
return out;
}
1.
2.
3.
Pascal Schärli 09.10.2020
3. Daraus folgt, dass sie auch nach der Schleife gilt.
static int divide(int in, int div){
assert(in >= 0 && div >= 0);
int n = in;
int out = 0;
// [Vor Schleife]
while(n >= div){
// [Vor Schleifenkörper]
out += 1;
n -= div;
// [Nach Schleifenkörper]
}
// [Nach Schleife]
return out;
}
in = n + out * div && n >= 0 && (in - n) % div = 0
in = n + out * div && n >= 0 && (in - n) % div = 0
Daraus folgt:
(Schleifeninvariante)
(Sonst wären wir nicht aus dem while-loop gekommen)
Pascal Schärli 09.10.2020
Wie findet man eine Schleifeninvariante?
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Knoten
Unterbäume
Baum
(
)
Baum
Unterbäume
,
Knoten
B
A
C
Z
A(B(C,D))
Pascal Schärli 09.10.2020
Var
Clause
(
)
+
private static int parseClause(String kd, int offset) throws ParseException {
if (!checkNext('(', kd, offset)) {
throw new ParseException("expected '('", offset);
}
offset++;
while(true){
offset = parseVar(kd, offset);
if (!checkNext('+', kd, offset)) {
break;
}
offset++;
}
if (!checkNext(')', kd, offset)) {
throw new ParseException("expected ')'", offset);
}
offset++;
return offset;
}
parst '('
parst Var
falls kein '+' folgt, Schleife abbrechen
sonst offset erhöhen ('+' parsen)
parst ')'
neuen offset zurückgeben
Pascal Schärli 09.10.2020
Pascal Schärli 09.10.2020
int j = 9;
int i = 0;
while(i < 9){
i++;
j--;
}
i + j == 9
i - j == 9
Welches ist die korrekte Schleifeninvariante?
Pascal Schärli 09.10.2020
int a = 0;
int b = 0;
while(b < 7){
b++;
a += 10;
}
b == a - 10
b == 0
Welches ist die korrekte Schleifeninvariante?
Pascal Schärli 09.10.2020
int info = -1;
int II = 1;
while(info < 2){
info++;
}
info - II == -2
info + II == 0
info*II <3
info / II < 2
Welches ist die korrekte Schleifeninvariante?
Pascal Schärli 09.10.2020
Welcher Jodel ist falsch?
Start
Mitte
Ende
Jodel
Start
j
o
Mitte
du
de
Ende
l
i
Pascal Schärli 09.10.2020
Mit welcher "Mitte" kann man
"jodeli" darstellen?
Start
Mitte
Ende
Jodel
Start
j
o
Mitte 1
du
de
Ende
l
i
Mitte 2
du
de
Mitte 3
du
de
Mitte 4
du
de
Pascal Schärli 09.10.2020
Welches Syntaxdiagramm wird von diesem Programm geprüft?
private static int parseStart(String kd, int offset) throws ParseException{
if(checkNext('j', kd, offset)){
offset++;
}
else{
throw ParseException("Expected \"j\" at "+offset);
}
while(checkNext('o', kd, offset)){
offset++;
}
return offset;
}
Start 1
j
o
Start 2
j
o
Pascal Schärli 09.10.2020
Pascal Schärli 09.10.2020
Findet eine Schleifeninvariante.
Beweist mittels der gefundenen Schleifeninvariante die Korrektheit der Implementierung.
Gilt nach der Änderung an Zeilen 5,6 noch die Schleifeninvariante?
Ist der Beweis immer noch gültig?
static int f(int i, int j) {
int u = i;
int z = 0;
while (u > 0){
z = z;
u = u;
}
return z;
}
static int f(int i, int j) {
int u = i;
int z = 0;
while (u > 0){
z = z + j;
u = u - 1;
}
return z;
}
Tipp: Der Beweis ist recht ähnlich zu meinem Beispiel im BestOf
Pascal Schärli 09.10.2020
Caesar-Verschlüsselung
Pascal Schärli 09.10.2020
public static String encrypt(String s) {
String ret = "";
for (int i = 0; i != s.length(); ++i) {
ret = ret + (char) (s.charAt(i) + 3);
}
return ret;
}
public static String decrypt(String s) {
// TODO
}
Pascal Schärli 09.10.2020
Pascal Schärli 09.10.2020
Pascal Schärli 09.10.2020
//checks if the char at position offset in the String kd is equal to c
Boolean checkNext(char c, String kd, int offset){ ... }
int parseTree(String kd, int offset){ ... }
int parseSubtree(String kd, int offset) { ... }
int parseNode(String kd, int offset){ ... }
Pascal Schärli 09.10.2020
Pascal Schärli 09.10.2020