Zum Inhalt springen

Benutzer:MartinThoma/Programmierparadigmen

Aus Wikiversity

Fragen zur Vorlesung

[Bearbeiten]

Teil 2: Theoretische Grundlagen

[Bearbeiten]

Eta-Äquivalenz

[Bearbeiten]

Kann mir jemand die -Äquivalenz, also insbesondere folgende Schreibweise von Folie 158 erklären:

Frage auf cs.stackexchange.

Regelsysteme (Folie 186)

[Bearbeiten]

Frage: Was soll "Beispiel Prädikatenlogik: Syntaktische Herleitbarkeit ()" bedeuten?

Antwort: Es wird ein Beispiel zur Funktionsweise des Frege'schen Schlussstrich an Hand den Regeln zur Syntaktischen Herleitbarkeit in der Prädikatenlogik gemacht.

Typinferenz

[Bearbeiten]
Allgemeines
[Bearbeiten]

Frage: Bekomme ich nur durch die APP-Regel neue Constraints?

Antwort: Nein, bei ABS ergibt sich ebenfalls ein neuer Constraint. Wenn man den unteren Typ nennt, und die oberen beiden und so muss gelten, dass . Im Beispiel ab Seite 197 werden auch bei VAR und CONST neue Constraints hinzugefügt.

Typsystem (Folie 191)
[Bearbeiten]

Frage: Was heißt auf Folie 191, z.B.:

Insbesondere will ich hier wissen, wie man ausspricht.


Antwort:

  • In der Fragestunde wurde gesagt, dass man es "aus <linke Seite> folgt syntaktisch <rechte Seite>". Dasselbe Zeichen mit einem doppelten horizontalen Strich wird "aus <linke Seite> folgt semantisch <rechte Seite>" gelesen.
  • Rechts von diesem Zeichen stehen die Typannahmen. Den Sinn von dieser Schreibweise versteht man, glaube ich, am besten bei der "ABS"-Regel: Wenn man "ABS" anwendet, macht man die Typannahme "kleiner" und bekommt dafür ein "lambda"
Typsystem (Folie 192)
[Bearbeiten]

Frage: Was ist "Const"? Ich vermute eine Menge aller Konstanten, aber wo kommt diese her?7 Antwort: Ich erinnere mich daran, dass er sowas meinte wie "wo auch immer die Menge Const herkommt".


Frage: Was bedeutet es, dass keine Überschneidungen bei Typvariablen generiert weden dürfen? Kann mir jemand ein Beispiel sagen, wo das passieren würde?

Typsystem (Folie 193)
[Bearbeiten]

Frage:

  • Was ist ? ist eine Menge von Typsubstitutionen, aber was ist ?
  • Was ist ? ist ein Typkontext, aber was ist ?

Antwort:

  • ist ein beliebiger, aber fester Typ.
  • ist eine beliebige, aber feste, freie Variable.
    • Edit: ist glaube ich ein Term und keine Variable.
Typschema (Folie 206)
[Bearbeiten]

Frage: Ist eine Typschemainstanziierung? Müsste dann nicht ein Typschema sein?

Typschema (Folie 207)
[Bearbeiten]

Frage: Warum sind -Gebundene Bezeichner niemals polymorph?

Antwort: "Ist halt so :-)". Ich denke die Typsierung funktioniert nun mal so, dass jeder Term _einen_ Typen erhält.

Parallelität

[Bearbeiten]
MPI_Gather
[Bearbeiten]
int MPI_Gather(void *sendbuf, int sendcount, 
    MPI_Datatype sendtype, 
    void *recvbuf, int recvcount, 
    MPI_Datatype recvtype, 
    int root, MPI_Comm comm)

Frage: Wann ist jemals sendcount != recvcount? Antwort: Vergleiche drittes Beispiel. Ohne spezielle Datenstruktur scheint es aber immer dasselbe zu sein.

Folie 10
[Bearbeiten]

Frage: Was soll die äußere for-Schleife in folgendem Beispiel?

for (i=0; i<size; i++) {
    MPI_Barrier(MPI_COMM_WORLD);
    if (i == myrank) {
        printf("Hello World, I have rank %d out of %d.\n",
            myrank, size);
    }
}

Wenn ich das mit mpicc for-example.c kompiliere und mit mpirun -np 3 a.out ausführe, erhalte ich:

Hello World, I have rank 0 out of 3.
Hello World, I have rank 1 out of 3.
Hello World, I have rank 2 out of 3.

Antwort:

  • Durch die for-Schleife wird die Reihenfolge garantiert. Da i von 0-2 geht, werden auch in dieser Reihenfolge die Nachrichten ausgegeben.
  • Ich glaube aber, dass es ohne MPI_Barrier(MPI_COMM_WORLD); nichtdeterministisch ist. Also die Hauptarbeit erledigt hier das Barrier Konstrukt. Kannst du es mal ohne Barrier probieren?
Folie 11
[Bearbeiten]

Frage: Wie kann eine Operation sowohl blockierend, als auch asynchron sein? Ich dachte, asynchrone Operationen sind gerade nicht blockierend.

Folie 13
[Bearbeiten]

Frage: Was ist das potentielle Probleme mit dem destination rank 1 in folgendem Beispiel?

#include "mpi.h"
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
    char msg[20];
    int myrank, tag=42;
    MPI_Status status;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);

    if (myrank == 0) {
        strcpy(msg, "Hello student!");
        MPI_Send(msg, strlen(msg)+1, MPI_CHAR, 1, tag, MPI_COMM_WORLD);
    } else {
        MPI_Recv(msg, 20, MPI_CHAR, 0, tag, MPI_COMM_WORLD, &status);
        printf("received \"%s\"\n", msg);
    }
    
    MPI_Finalize();
    return 0;
}

Antwort: Es wird nicht geprüft, ob es überhaupt den rank 1 gibt. Vielleicht wurde das Programm nur mit einem Prozessor gestartet.

Folie 22
[Bearbeiten]

Frage: Was ist 'remote data'?

Compilerbau

[Bearbeiten]

Frage: Was genau ist der abstrakte Syntaxbaum, was der konkrete Syntaxbaum?

Antwort:

  • Der konkrete Syntaxbaum hat - im Gegensatz zum abstrakten Syntaxbaum - noch keine Typannotationen. (Richtig?)
  • Siehe Seite 359f. Jedes Token erhält eine abstrakte Klasse. Dem Syntaxbaum kann man abgelesen, mit welchen Produktionen das Wort erzeugt wurde. Dem abstrakten Syntaxbaum sieht man an, welche "abstrakte" Struktur das Wort hat. Zum Beispiel hat der Term die abstrakte Struktur MultOp -> (Val->5, DivOp -> (Var->x, Val->7)). Dem Compiler ist es egal, wie das Wort erzeugt wurde, meistens soll es aber eine bestimmte Struktur haben, die hiermit geprüft werden kann. (Bin mir damit nicht sicher, macht im Moment aber am meisten Sinn für mich).

First / Follow

[Bearbeiten]

Frage: Warum ist auf Folie 348 Follow(E') = {#, )}? Ich dachte, es müsste Follow(E') = {#} sein.

Antwort: Wegen der Regel "F -> id | (E)" . E kann auf TE' abgebildet werden und somit folgt ein ")" auf ein E'

Fragen zur Klausuren

[Bearbeiten]

Altklausuren

WS2010/11

[Bearbeiten]

Aufgabe 3: Typinferenz

[Bearbeiten]

Frage: Kann das bitte jemand erklären?

Aufgabe 4: Logische Programmierung

[Bearbeiten]

Frage zu b): Was bedeuten die gestrichelten Pfeile? Warum existiert ein Pfeil von nach ? Warum existiert sowohl ein Pfeil von nach als auch ein Pfeil von nach ?

Aufgabe 5: C

[Bearbeiten]

Code:

#include <stdio.h>

char p[] = "HelloWorld";
int i[] = {2,1,3,5,6}, j = 4;

int main()
{
    printf(&(p[*(i + j)]));
    return 0;
}

Ausgabe: orld

Frage: Wie kommt es zu dieser Ausgabe? Frage auf SO

Antwort: Auf SO

Aufgabe 7: MPI

[Bearbeiten]

Frage: Kann mir jemand erklären, warum die Musterlösung hier stimmt? (a und b)

Antwort zu a):

MPI_Scatter(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype, root, comm)

MPI_Scatter verteilt Daten vom Prozess root unter alle anderen Prozesse in der Gruppe, so daß, soweit möglich, alle Prozesse gleich große Anteile erhalten.

Konkret bedeutet das:

  • buf_1 ist ein Buffer mit Werten. Jeder Prozess soll Werte erhalten. Also erhält jeder Prozess eine Zeile von dem Prozess 0.
  • In der for-Schleife, also -mal (für Prozess , also den der Zeile der Matrix hat): Jeder der verschiedenen Prozesse erhält genau einen int. Dieser wird im Array buf_3 an die i-te Stelle geschrieben. Also:
    • Knoten 0 hat Zeile 0 der Matrix (ich nenne sie mal A[zeile][spalte]) erhalten. Also: (buf_2 auf Knoten 0) == A[0]
    • Knoten 0 schickt den ersten Array-Eintrag von buf_2 an Knoten 0: (buf_2[0] auf Knoten 0) == A[0][0]
    • Knoten 0 schickt den zweiten Array-Eintrag von buf_2 an Knoten 1: (buf_2[1] auf Knoten 0) == A[0][1]
    • Allgemein: Knoten 0 schickt den i-ten Array-Eintrag von buf_2 auf Knoten_i: (buf_2[i] auf Knoten 0) == A[0][i]
    • Knoten 1 schickt den ersten Array-Eintrag von buf_2 an Knoten 0: (buf_2[0] auf Konten 1) == A[1][0]
    • Allgemein: Knoten 1 schickt den i-ten Array-Eintrag von buf_2 auf Knoten_i: (buf_2[i] auf Knoten 1) == A[1][i]
    • Allgemein: Knoten j schickt den i-ten Array-Eintrag von buf_2 auf Knoten_i: (buf_2[i] auf Knoten j) == A[j][i]

=> Knoten i Enthält die i-te Spalte

Antwort zu b):

int MPI_Alltoall(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm)

MPI_Alltoall teilt Daten von jedem Prozeß einer Gruppe an alle anderen auf.

Also konkret:

MPI_Alltoall(buf_2, 1, MPI_INT, buf_3, 1, MPI_INT, comm)
  • Für jeden der Prozesse in comm gilt:
    • Für die Elemente aus buf_2 wird jeweils 1 Element auf einen Prozess in comm gelegt.
    • Dort wird es jeweils in buf_3 gelegt.

Ich glaube da gibt es nicht viel mehr zu erklären. Die Operation macht halt das gewünschte.

SS2011

[Bearbeiten]

Aufgabe 3: Typinferenz

[Bearbeiten]

Frage: Wie muss man bei dieser Aufgabe vorgehen?

Frage: Warum ist nicht im Typkontext ? Ich dachte, wenn etwas im Typkontext höher, also als Bedingung für den Schlussstrich, ist, dann muss es in allen tieferen Ebenen mitgezogen werden?

Aufgabe 4: Logische Programmierung

[Bearbeiten]

Frage: Wie funktioniert das Rätsel?

Antwort: Folgende Schritte durchführen:

  1. 8-0-0
  2. 5-0-3
  3. 5-3-0
  4. 2-3-3
  5. 2-5-1
  6. 0-5-1
  7. 1-5-0
  8. 1-0-3
  9. 4-0-0


Frage: Wie funktioniert Teil b?

Teilantwort

  • F0 ist eine Liste mit 3 Elementen für die 3 Eimer (8L-Eimer, 5L-Eimer, 3L-Eimer).
  • FL ist der gewünschte Füllzustand.
  • Ms ist eine Liste aus Strings, die die durchgeführten Aktionen beschreibt.
  • Fs ist eine Liste von bereits besuchten zuständen.
 solve(X,X,[],_).
 solve(X,Y,[M|Ms],Fs) :- move(X,M,F),not(member(F,Fs)),solve(F,Y,Ms,[F|Fs]).

Die erste Zeile deckt den Fall ab, dass wir bereits die gewünschte Konfiguration haben

Die zweite Zeile ist interessanter.

  • A :- B ist als "Wenn B gilt, dann mache A" zu lesen.
  • , auf der rechten Seite ist als logisches "und" zu lesen.
  • [F|Fs] nimmt eine Liste Fs und eine Element F und erstellt eine neue Liste, die mit F beginnt und die Elemente aus Fs hat

Also: Falls wir den Zug machen, in dem wir von der Konfiguration X mit der Beschreibung M in die Konfiguration F übergehen UND diese Konfiguration F nicht in der Liste Fs ist UND wir von der Konfiguration F in die Konfiguration Y kommen, dann mache den übergang von der Konfiguration X in die Konfiguration Y. (TODO: Stimmt das so?)

Für das 4L Problem würde man das so benutzen:

 solution(Ms) :- start(F0), solve(F0, FL, Ms, [F0]), final(FL).
 start((8,0,0)).
 final((_,4,_)).
 final((4,_,_)).

Aufgabe 6: X10

[Bearbeiten]

Frage: Was ist here?
Antwort: Im Aufgabentext beschrieben. here in diesem Kontext ist ein bestimmter Place. Siehe Seite 16 der X10-Folien.

Aufgabe 7: Scala

[Bearbeiten]

Frage: Was macht ein einzelnes Ausrufezeichen in folgendem Code?

class SquareChecker extends Actor {
    def squareCheckPartA(input: Int): Boolean = {
        var resultA = (input % 10 != 2 && input % 10 != 3)
        return resultA
    }
    def squareCheckParallel(input: Int): Boolean = {
        val firstHelper = new HelperActor(this).start
        firstHelper ! input
        val resultA = squareCheckPartA(input)
        var resultHelper = true
        receive { // default "case _" not used here
            case x : Boolean => resultHelper = x
        }
        return resultA && resultHelper
    }
    def act() { }
}
class HelperActor(parent: SquareChecker) extends Actor {
    def act = receive { case x: Int => squareCheckPartB(x)}
    def squareCheckPartB(input: Int) {
        var resultB = input % 10 != 7 && input % 10 != 8
        parent ! resultB
    }
}

Frage im Forum im VAB

Antwort: Siehe Scala-Folien Seite 52. Zitat Forum: "parent ! resultB" sendet eine Nachricht mit Inhalt "resultB" an (den Actor) "parent" (nachzulesen in den Scala-Folien, Folie Nr. 52, "Messaging, the Basics")."

SS2012

[Bearbeiten]

Aufgabe 2: Prolog

[Bearbeiten]

Frage: Wie Funktioniert das Kohlkopf / Ziege / Wolf - Rätsel?

Antwort: Man kann nur den Kohlkopf und den Wolf unbeaufsichtigt lassen.

  1. Also bringt man im ersten Schritt die Ziege auf die andere Seite.
  2. Dann fährt man zurück, nimmt den Kohlkopf mit auf die andere Seite und nimmt die Ziege wieder zurück
  3. Man läd die Ziege aus, den Wolf ein und fährt den Wolf auf die andere Seite.
  4. Nun fährt man wieder zurück und hohlt die Ziege.

Aufgabe 7: Syntaktische Analyse

[Bearbeiten]

Frage: Ich glaube die Lösung ist falsch. Wie würde der Parser den Regulären Ausdruck parsen?

Antwort: Ich bin das mal durchgegangen und komme auf das korrekte Ergebnis. Beachte, dass char ein Zeichen ist. Zum Beispiel ist ein konkretes Beispiel zu deinem regulären Ausdruck.

Step-by-step:

"Methode" Aktuelles Zeichen AST (Ergebnis aus selber Zeile)
R("") ( --
R'(R("")) ( --
R'(R'(R(""))) A char->A
R'(R'("","")) Union -> (char->A, R()) = Union -> (char->A, ))
R'("", "") (Durch geschachtelten Aufruf von R ist aktuelles Token weiter vorgerückt) Union -> (Union -> (char->A, )), R()) = Union -> (Union -> (char->A, )), char->B)


Dabei sind der erste Parameter immer der aktuelle Rest des RegEx, und die zweiten Parameter bei R'-Aufrüfen die Belegung von left für die R' Methode. Hoffentlich versteht man das so besser, mir ist keine bessere Formatierung eingefallen.

Das komplizierte ist es, bei den inneren Verschachtelungen zu beachten, dass der Token weitergerückt wird. Nach dem letzten Schritt ist man fertig, da wiederum im geschachtelten Aufruf von R das aktuelle Token auf ')' verschoben wurde, was im UNION-case von R' "akzeptiert" wird und weiter gesprungen wird an das Wortende.

Der erhaltene AST stimmt mit dem überein, den ich bekomme, wenn ich deinen RegEx manuell produziere.

WS 2011/2012

[Bearbeiten]

Aufgabe 2: Prolog

[Bearbeiten]

Frage: Warum wird die zweite Zeile in

remove([(X,A)|L],X,[(X,ANew)|L]) :- A>0, ANew is A-1.
remove([ X   |L],Y,[   X    |L1]):- remove(L,Y,L1).

benötigt?

Aufgabe 4: Typinferenz

[Bearbeiten]

Frage: Wie kommt man in der a) auf ?

Aufgabe 7: X10

[Bearbeiten]

Frage: What is the difference of 'async' before or after for in X10?

Aufgabe 8: Syntaktische Analyse

[Bearbeiten]
Teilaufgabe a
[Bearbeiten]

Frage: Wo kommt diese Syntax her? Antwort: Folie 359f.

WS 2012/2013

[Bearbeiten]

Aufgabe 2

[Bearbeiten]

Frage zu Teil b): Was ist die Normalform einer -Funktion?

Aufgabe 9

[Bearbeiten]

Frage: Warum ist * nicht in Follow(R)?

SS 2013

[Bearbeiten]

Aufgabe 3: Typinferenz

[Bearbeiten]

Frage:

Sind alle Terme der Form

auch von der Form

?


Antwort: Ja, weil rechtsassoziativ.

Fragen zur Übungsblättern

[Bearbeiten]

Materialien

[Bearbeiten]