Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

motja

Trainee

  • "motja" started this thread

Posts: 53

Date of registration: Nov 8th 2004

1

Sunday, November 19th 2006, 10:27am

Scheme Übungsblatt5

weißt jemand, wie die Listen in Scheme definiert sind?

Aufgabe 1.c)
Welche der folgenden Strukturen sind Listen? Begr¨unden Sie Ihre Antwort.
(cons (cons 1 2) (cons 3 (cons 4 (cons (cons 5 6) (cons 7 (cons (cons 8 9) ’()))))))
(cons 1 (cons 2 (cons 3 (cons (cons 4 5) (cons 6 (cons 7 (cons (cons 8 ’()) 9)))))))
(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 (cons 6 (cons (cons 7 8 ) (cons 9 ’()))))))))
(cons ’() (cons (cons (cons 1 (cons 2 (cons (cons 3 4) 5))) (cons (cons 6 7) 8 )) 9))
(cons (cons (cons (cons (cons (cons (cons 1 (cons 2 (cons 3 4))) 5) 6) 7) 8 ) 9) ’())

Meiner Meinung nach sind die entweder alle Bäume ader alle Listen.

Markus

the one and only Unterstrich!

Posts: 2,571

Date of registration: Oct 9th 2003

2

Sunday, November 19th 2006, 12:41pm

RE: Scheme Übungsblatt5

Quoted

Original von motja
weißt jemand, wie die Listen in Scheme definiert sind?


klick <-- In Kapitel 2 findest du alles, was du brauchst - zumindest die Definition von Listen ;)
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

Kandidat

Praktikant

Posts: 4

Date of registration: Nov 19th 2006

3

Sunday, November 19th 2006, 11:11pm

RE: Scheme Übungsblatt5

Also, sooo eindeutig geht das aus Kapitel 2 nicht hervor, da steht nur dass dir cons-Prozedur mit nil enden muß um eine Liste zu sein.

Was ist aber, wenn es vorher eine Abzweigung gab?

z.B. (cons (cons 1 2) (cons 3 nil))

Ist das dann auch eine Liste oder eher ein Baum?
Der Zweig (cons 1 2) hört ja nicht mit nil auf, ist also per Definition KEINE Liste.

PS: Hilfreich war für mich auch die Seite :D
Scheme

This post has been edited 3 times, last edit by "Kandidat" (Nov 20th 2006, 12:01am)


Markus

the one and only Unterstrich!

Posts: 2,571

Date of registration: Oct 9th 2003

4

Sunday, November 19th 2006, 11:25pm

(cons 1 2) ist keine Liste, richtig.
Spätestens wenn im dritten Semester verkettete Listen an die Reihe kommen, wird diese Aufgabe zum Kinderspiel. Ok, aber das kommt nächstes Jahr ;)
Stell dir eine Liste mit n Elementen als n Kästchen vor. Jedes Kästchen hat zwei Felder, ein Datenfeld und ein Zeigerfeld. Der Zeiger zeigt auf das nächste Kästchen, oder ist null (nil) wenn kein weiteres Kästchen folgt.
Will man 1 2 nun in eine Liste packen, sieht das also so aus:

1_-> 2_\ wobei -> jetzt der Zeiger auf das nächste Elemtn sein soll und \ der Nullzeiger.

(cons 1 2) ist demnach keine Liste, weil im zweiten Feld des "Kästchens" kein weiterer Zeiger auf das nächste Kästchen steht, sondern weitere Daten.

Wenn man sich (cons (cons 1 2) (cons 3 nil)) anschaut, dann musst du dir überlegen, wann bei einem cons als zweites Element ein neues cons steht, damit also quasi ein neuer Zeiger auf ein nächstes Kästchen -> dann ist dieser Teil eine Liste (und dass musst du natürlich für alle Teilstrukturen testen ;)).

Die Erklärung mit den Zeigern mag vielleicht nicht 100%ig korrekt sein, da mir die interne Struktur von Scheme leider nicht so geläufig ist, wie ich es mir wünschen würde, aber ich hoffe, zum Verständnis hat es etwas beigetragen (:
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

Philipp

Praktikant

  • "Philipp" is male

Posts: 13

Date of registration: Nov 11th 2006

5

Monday, November 20th 2006, 6:48pm

Für den Notfall benutze (list? (cons ... ) ) um erstmal grob abschätzen zu können was eine Liste ist und was nicht, die Erklärungsfindung ist dann vielleicht einfacher.

Allerdings muss auch ich sagen, dass es sehr unlogisch ist, mit dem eingeführten Kästchen Schema von cons auf Liste zu kommen. Und sofern nicht in der Vorlesung gesagt worden wäre( Grund die Zeigerarithmetik ist ganz anders und ähnelt eher einem Array ), das Scheme versucht eine Liste aus cons Ausdrücken zu bauen, sofern dies möglich ist, heisst man "terminiert" es logisch mit NULL am Ende, wofür es dann wohl 2 Varianten gibt, wäre es nach wie vor uneinsichtig.
Mögen all deine Träume sich erfüllen, Träumer; mögen sie dir stets Glück und Erkenntnis bringen. ( Sergio Bambaren, Der träumende Delphin )

Markus

the one and only Unterstrich!

Posts: 2,571

Date of registration: Oct 9th 2003

6

Monday, November 20th 2006, 7:58pm

Quoted

Original von Philipp
( Grund die Zeigerarithmetik ist ganz anders und ähnelt eher einem Array )

Die Zeigerarithmetik ähnelt eher einem Array?
Meiner Erfahrung nach, stellt sich das eher so da:
Array: Reserviert x stellen im Speicherbereich der Länge n, und wenn auf Element 7 zugegriffen werden soll, dann gehe nach Anfang + 7 * n.
Nix Zeiger.
(Verkettet) Liste: Eine Liste besteht aus Elementen, welche aus einem Datenfeld und einem Zeigerfeld bestehen. Es gibt einen ausgezeichnetes Feld der Liste, den sogenannten Kopf. Der Verweist auf ein weiteres Element der Liste, dieses auf ein neues usw. bis zum letzten Element, dass einen Zeiger ins Nirvana hat.

So würde ich das ganze mal ganz grob umschreiben, korrigiert mich, wo ich falsch liege. ;)

Quoted

Und sofern nicht in der Vorlesung gesagt worden wäre, das Scheme versucht eine Liste aus cons Ausdrücken zu bauen, sofern dies möglich ist, heisst man "terminiert" es logisch mit NULL am Ende, wofür es dann wohl 2 Varianten gibt, wäre es nach wie vor uneinsichtig.

Kannst du diesen Satz ggf. mal entschachteln, ich steig nämlich nicht durch ?( (Also das mit den zwei Varianten und dem uneinsichtig)
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

Philipp

Praktikant

  • "Philipp" is male

Posts: 13

Date of registration: Nov 11th 2006

7

Tuesday, November 21st 2006, 6:11pm

@Markus

Wenn man Mehrdimensionale Arrays nimmt, dann ähnelt das schon von dem Kästchenschema sehr cons ( Primitives Mehrdimensionales Array ). Ein Array ist übrigens auch ein Zeiger. Und zwar enthält enthält es die Adresse des ersten Segments. Über die Arithmetik greift man dann auf die nächsten Segmente zu ausgehend von der Adresse des ersten Zeigers. Eine Liste ist nur eine sinnvollere Variante wenn man oft reallociert, weil sich die Listen durch den ganzen HEAP ziehen kann, während man bei Arrays immer einen gesamten Block ( Alter Block + neues Segment ) reallocieren muss.
Ansonsten gibt es da keinen Unterschied. Ein Array kann genauso einen ganzen Datenblock beherbergen z.B. von struct{}; .
Ist aber auch egal und gehört hier wohl gar nicht rein.

Von Scheme wird sowohl (cons 1 (cons 1 '() ) ) als auch (cons (cons 1 1 ) '() ) als Liste durch list? erkannt, wenn gleich zweites Output nicht nach Liste aussieht.
Mögen all deine Träume sich erfüllen, Träumer; mögen sie dir stets Glück und Erkenntnis bringen. ( Sergio Bambaren, Der träumende Delphin )

Markus

the one and only Unterstrich!

Posts: 2,571

Date of registration: Oct 9th 2003

8

Tuesday, November 21st 2006, 6:56pm

Philipp, Liste ungleich Heap, Liste ungleich Array!
Liste und Array sind total unterschiedliche Datenstrukturen, bei einer Liste sind die Daten absolut und nicht über Adressarithmetik referenziert. Daher die Zeiger. Beim Array gibt eine Referenz auf den Anfang, von mir aus noch aufs Ende und das war's.
Ich empfehle zum Verständnis von Listen zum Beispiel wiki. Und für Scheme das hier.
Und natürlich die Vorlesung zu Datenstrukturen und Algorithmen.

Und wenn du das mit den Listen drauf hast, wirst du auch verstehen, warum (cons (cons 1 1 ) '() ) eine Liste ist, und (cons 1 1 ) nicht ;)
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

Kandidat

Praktikant

Posts: 4

Date of registration: Nov 19th 2006

9

Wednesday, November 22nd 2006, 9:02am

Quoted

Original von Markus
(und dass musst du natürlich für alle Teilstrukturen testen ;)).

(:


Markus,
soweit alles klar, nur Dein eingeklammerter Satz verwirrt mich noch etwas.
Was meinst Du mit "Teilstruktur"?

Im Wiki steht:
"Außerdem ist ein Paar, dessen cdr eine Liste ist eine Liste"

Das heisst für mich, ich muss nur die cdr's betrachten. Ob sich vom car eine neue Liste oder irgendwas "abspaltet" ist egal.

Also ist mein beispiel von oben (cons (cons 1 2) (cons 3 '())) demnach auch eine Liste.

#t oder #f?

migu

free rider

  • "migu" is male

Posts: 2,643

Date of registration: Dec 11th 2001

Occupation: Developer

10

Wednesday, November 22nd 2006, 9:56am

Quoted

Original von Kandidat
Also ist mein beispiel von oben (cons (cons 1 2) (cons 3 '())) demnach auch eine Liste.

#t oder #f?
#f
Markus meint mit Teilstruktur sicherlich alle Listen innerhalb einer anderen Liste. Du musst also rekursiv alle Listen prüfen, bis keine Liste mehr in einer anderen enthalten ist.
Zu deinem Beispiel: Weil die "Unterliste" (Teilstruktur) (cons 1 2) selbst keine Liste ist, ist die Gesamtliste auch keine Liste.
tar: Anlegen eines leeren Archivs wird feige verweigert.

Kandidat

Praktikant

Posts: 4

Date of registration: Nov 19th 2006

11

Wednesday, November 22nd 2006, 10:38am

Quoted

Original von migu
Weil die "Unterliste" (Teilstruktur) (cons 1 2) selbst keine Liste ist, ist die Gesamtliste auch keine Liste.


Ja, so dachte ich nach Markus posting auch.

Aber nach der Wiki-Definition IST es eine Liste.

Und wenn ich mein Beispiel mit list? überprüfe bekomme ich ein #t

?( ?( ?(

migu

free rider

  • "migu" is male

Posts: 2,643

Date of registration: Dec 11th 2001

Occupation: Developer

12

Wednesday, November 22nd 2006, 11:41am

Quoted

Original von Kandidat
Aber nach der Wiki-Definition IST es eine Liste.

Und wenn ich mein Beispiel mit list? überprüfe bekomme ich ein #t
Ja, das ist in der Tat merkwürdig.
Nach Möglichkeit sollte man sich an die Definition aus der Vorlesung halten. Vor allem natürlich, wenn das in der Aufgabenstellung so gefordert wird. :)
tar: Anlegen eines leeren Archivs wird feige verweigert.

oixio

Senior Schreiberling

  • "oixio" is male

Posts: 517

Date of registration: Oct 3rd 2004

13

Wednesday, November 22nd 2006, 12:11pm

Wichtig ist nur die äußere Struktur. Was an den einzelnen Listenprositionen für Objekte hängen ist irrelevant.
Dieser Post wurde aus 100 % chlorfrei gebleichten, handelsüblichen, freilaufenden, glücklichen Elektronen erzeugt!

Markus

the one and only Unterstrich!

Posts: 2,571

Date of registration: Oct 9th 2003

14

Wednesday, November 22nd 2006, 3:25pm

Quoted

Original von Kandidat
Markus,
soweit alles klar, nur Dein eingeklammerter Satz verwirrt mich noch etwas.
Was meinst Du mit "Teilstruktur"?

Im Wiki steht:
"Außerdem ist ein Paar, dessen cdr eine Liste ist eine Liste"

[...]

Also ist mein beispiel von oben (cons (cons 1 2) (cons 3 '())) demnach auch eine Liste.

#t oder #f?


Hi, das mit den Teilstrukturen war schelcht ausgedrückt von mir, sorry.
Ich meinte das so: Wenn der Kopf eine Liste ist, also ein Paar aus "Daten und Zeiger" (auch wenn das jetzt so nicht korrekt sein mag für Scheme, s.o.) und das ganze eine Liste sein soll, dann muss das nächste Element (und die folgenden) auch so aufgebaut sein. Das meinte ich mit Teilsturktur, das war schlecht formuliert. Wesentlich besser ist die Formulierung von wiki, also "Außerdem ist ein Paar, dessen cdr eine Liste ist eine Liste".

In deinem Beispiel hast du ein Paar (das erste cons) das im cdr-Feld auf ein weiteres Paar verweist, und im car Feld ist ebenfalls ein cons-Paar. Was im car-Feld steht, kannst du als "irgendwelche" Daten ansehen. Diese Daten können natürlich wieder eine Liste sein, müssen aber nicht ;)

Ich hoffe, dass ist jetzt klarer? (:
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

iriania

Junior Schreiberling

  • "iriania" is female

Posts: 222

Date of registration: Nov 24th 2003

Location: Waqwaq

Occupation: Wie? Ich studiere? seit wann denn?

15

Wednesday, November 22nd 2006, 6:45pm

Eine Scheme-Liste hat folgende Eigenschaften:
1. Sie ist leer ()
oder
2. Sie enthält einen oder mehrere Elemente, wobei diese Elemente nur durch Leerzeichen voneinander getrennt sind, also nicht durch Punkte, Kommata, etc.

Ich erinnere mich daran, dass ich die Frage, ob z.B.
(cons (cons 1 2) (cons 3 (cons 4 (cons (cons 5 6) (cons 7 (cons (cons 8 9) ’()))))))

eine Liste ist oder nicht immer dadurch gelöst habe, indem ich mir die Endform davon in der Ausgabe angesehen habe.

so soll eine Liste in der Ausgabe aussehen:
(1 2 3 (5 4 6) 3 2)
oder so:
(1 2 3 4 5 6 7 8 )
oder so:
()
aber niemals so:
(1 . 2 3 4 5)
oder
(1 2 3 4 . 5)
ich hoffe, es ist klar, was ich sagen wollte - Scheme ist für mich schon länger her und ich habe auch kein drScheme mehr auf meinem PC.
...und sie dreht sich doch!

Kojack

Trainee

Posts: 97

Date of registration: Oct 10th 2006

16

Wednesday, November 22nd 2006, 10:02pm

Kann mir jemand mal eben sagen wie ich einer Liste immer
ein bestimmtes Element anhängen kann?
Niveau sieht von unten oft aus wie Arroganz

Helicase

Trainee

  • "Helicase" is male

Posts: 85

Date of registration: Oct 3rd 2006

17

Wednesday, November 22nd 2006, 10:21pm

da wird dir wohl append weiterhelfen.. einfach zwei listen als argumente angeben und schon hast du deine zusammengefügte liste.
Wenn du nur ein Element und nicht ne ganze Liste hinzufügen willst einfach (list element) und das dann als an die Funktion.

Append steht auch unten drauf, also darf man das ruhig benutzen.

This post has been edited 1 times, last edit by "Helicase" (Nov 22nd 2006, 10:22pm)


Kojack

Trainee

Posts: 97

Date of registration: Oct 10th 2006

18

Wednesday, November 22nd 2006, 10:25pm

also muss ich, sofern ich nur eine liste und ein einzelnes element habe trotzdem sowas wie
append (list 1 2 3 4) (list 5) machen richtig?

Also irgendwie geht das so nicht so richtig, ich bekomme dann eine liste die wie folgt aussieht: (x x x x . x) und dann weigert der sich beim 2 ten mal ein element dran zu hängen...
Niveau sieht von unten oft aus wie Arroganz

This post has been edited 1 times, last edit by "Kojack" (Nov 22nd 2006, 11:31pm)


ctk

Trainee

  • "ctk" is male

Posts: 113

Date of registration: Oct 15th 2004

19

Wednesday, November 22nd 2006, 11:30pm

Quoted

Original von Kojack
also muss ich, sofern ich nur eine liste und ein einzelnes element habe trotzdem sowas wie
append (list 1 2 3 4) (list 5) machen richtig?

Richtig.
Das Problem ist, dass Scheme nur einfach verkettete Listen kennt. D.h. es ist nur möglich direkt auf das erste element der Liste zuzugreifen und ein element vor die Liste zu hängen, will man an das letzte Element muss man sich bis zum ende hangeln und das anhängen ist auch nicht so trivial.

einfach:
(cons 1 (list 2 3 4 5))

kompliziert:
(append (list 1 2 3 4) (list 5))
Technik ist der Wettlauf der Intelligenz mit der Kreativität der Narren.
Bis heute haben die Narren immer gewonnen.

Kojack

Trainee

Posts: 97

Date of registration: Oct 10th 2006

20

Wednesday, November 22nd 2006, 11:37pm

Ja aber man kann doch mit append zwei listen zusammenfügen oder nicht, wenn also zwei listen bekannt sind, kann man sie doch auch an einander hängen...
Mein Problem ist, dass ich eine fehlermeldung bekomme wenn ich das so mache wie du:
(append (list 1 2 3 4) (list 5))

kann man anstatt der zahl "5" nun auch z.b. "car x" als element der liste eingeben? dabei sagt er mir das geht nicht.
Niveau sieht von unten oft aus wie Arroganz