<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Lambda Kalkül]]></title><description><![CDATA[<p>Hallo zusammen<br />
Ich schreibe gerade eine kleine Arbeit über Lisp und muss mir in diesem Zusammenhang einen groben Überblick über das Lambda Kalkül verschaffen, welches ja Lisp massgeblich beeinflusst hat. Leider habe ich so meine Schwierigkeiten mit diesem Lambda Kalkül...</p>
<p>λs.(λz.z) (Die Zahl 0 definiert im λ-Kalkül)<br />
Ähmm... hehe... Ja ich bin sicher das sie das ist... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Frage 1: Was ist in diesem Beispiel &quot;s&quot; und was ist &quot;z&quot;?<br />
Frage 2: Ich habe mal versucht, mir das als mathematische Funktionen zu notieren:<br />
f(s) = f(z) and f(z) = z, dann müsste doch aber auch s = z sein? Und dänn könnte man doch den kompletten Term schlicht auf s reduzieren? Aber eine β-Reduktion auf den Lambda Term ist IMHO unmöglich?</p>
<p>Kennt jemand dieses Lambda Kalkül und hat Lust, es einem armen Studenten näher zu bringen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Mfg Samuel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/258709/lambda-kalkül</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Apr 2026 07:25:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258709.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Jan 2010 08:21:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Lambda Kalkül on Thu, 14 Jan 2010 08:22:10 GMT]]></title><description><![CDATA[<p>Hallo zusammen<br />
Ich schreibe gerade eine kleine Arbeit über Lisp und muss mir in diesem Zusammenhang einen groben Überblick über das Lambda Kalkül verschaffen, welches ja Lisp massgeblich beeinflusst hat. Leider habe ich so meine Schwierigkeiten mit diesem Lambda Kalkül...</p>
<p>λs.(λz.z) (Die Zahl 0 definiert im λ-Kalkül)<br />
Ähmm... hehe... Ja ich bin sicher das sie das ist... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Frage 1: Was ist in diesem Beispiel &quot;s&quot; und was ist &quot;z&quot;?<br />
Frage 2: Ich habe mal versucht, mir das als mathematische Funktionen zu notieren:<br />
f(s) = f(z) and f(z) = z, dann müsste doch aber auch s = z sein? Und dänn könnte man doch den kompletten Term schlicht auf s reduzieren? Aber eine β-Reduktion auf den Lambda Term ist IMHO unmöglich?</p>
<p>Kennt jemand dieses Lambda Kalkül und hat Lust, es einem armen Studenten näher zu bringen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Mfg Samuel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1838597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1838597</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Thu, 14 Jan 2010 08:22:10 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Thu, 14 Jan 2010 08:49:03 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p>Hallo zusammen<br />
Ich schreibe gerade eine kleine Arbeit über Lisp und muss mir in diesem Zusammenhang einen groben Überblick über das Lambda Kalkül verschaffen, welches ja Lisp massgeblich beeinflusst hat. Leider habe ich so meine Schwierigkeiten mit diesem Lambda Kalkül...</p>
<p>λs.(λz.z) (Die Zahl 0 definiert im λ-Kalkül)<br />
Ähmm... hehe... Ja ich bin sicher das sie das ist... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
</blockquote>
<p>Das ist *eine* Möglichkeit, die Zahl 0 zu definieren. Die Idee bei Church-Numerals ist, dass die Zahl n durch eine Funktion f dargestellt wird, die eine gegebene Funktion g genau n Mal verkettet auf ein x anwendet. Oder anders formuliert:<br />
Die Zahl n wird dargestellt durch eine Funktion f mit der Eigenschaft:</p>
f(g, x) = \underbrace{g(g(g(\cdots g(g(\!}_{\text{$n$ mal}}x))\cdots)))

<p>f(g, x) = x bedeutet &quot;g wird 0 mal angewendet&quot;. Dieses f repräsentiert deswegen die Zahl 0.</p>
<p>Ishildur schrieb:</p>
<blockquote>
<p>Frage 1: Was ist in diesem Beispiel &quot;s&quot; und was ist &quot;z&quot;?</p>
</blockquote>
<p>Du benutzt den sogenannten untypisierten Lambda-Kalkül, deswegen sind &quot;s&quot; und &quot;z&quot; bei dir nur Variablennamen, die für alles stehen können. Man könnte die auch x und y nennen, oder ganz anders. Ich hab sie oben g und x genannt.</p>
<p>Ishildur schrieb:</p>
<blockquote>
<p>Frage 2: Ich habe mal versucht, mir das als mathematische Funktionen zu notieren:<br />
f(s) = f(z) and f(z) = z, dann müsste doch aber auch s = z sein?</p>
</blockquote>
<p>Du kannst nicht für zwei verschiedene Funktionen denselben Namen &quot;f&quot; nehmen.</p>
<p>Zwei lambdas direkt hintereinander liest man üblicherweise als Funktion mit zwei Parametern (Falls dich genauer interessiert, warum man das darf: Das Stichwort ist &quot;Currying&quot;).</p>
<p>Ishildur schrieb:</p>
<blockquote>
<p>Und dänn könnte man doch den kompletten Term schlicht auf s reduzieren? Aber eine β-Reduktion auf den Lambda Term ist IMHO unmöglich?</p>
</blockquote>
<p>λs.(λz.z) ist (wg. currying) eine Funktion mit zwei Parametern. Die ignoriert ihren ersten Parameter und gibt ihren zweiten unverändert zurück. Die lässt sich im Lambda-Kalkül nicht mit weniger als zwei lambdas schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1838604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1838604</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Thu, 14 Jan 2010 08:49:03 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Thu, 14 Jan 2010 15:06:24 GMT]]></title><description><![CDATA[<blockquote>
<p>Kennt jemand dieses Lambda Kalkül und hat Lust, es einem armen Studenten näher zu bringen?</p>
</blockquote>
<p>Was ist am Wikipedia-Artikel bzw. bei den weiterfuehrenden Links wie <a href="http://www.betoerend.de/dasLandHinterDemEndeDesSinns/lambda/welcome.html" rel="nofollow">http://www.betoerend.de/dasLandHinterDemEndeDesSinns/lambda/welcome.html</a> unverstaendlich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1838858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1838858</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 14 Jan 2010 15:06:24 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Thu, 14 Jan 2010 17:49:08 GMT]]></title><description><![CDATA[<p>Oh, zum Lambda-Kalkül darf natürlich eine Seite nicht fehlen: <a href="http://worrydream.com/AlligatorEggs/" rel="nofollow">Alligator Eggs!</a>. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1838958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1838958</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Thu, 14 Jan 2010 17:49:08 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Sat, 16 Jan 2010 18:05:44 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21632">@knivil</a><br />
Ich habe den Link gelesen, verstehe jedoch die Sache mit den Zahlen nach wie vor nicht! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Folie 42: Natürliche Zahlen<br />
------------------------------<br />
F^n(A) (die n-malige Anwendung von F auf A) wird induktiv blah blah blah...<br />
Ok, das verstehe ich, aber wo steht geschrieben, dass F den Wert A um genau 1 inkrementiert?</p>
<p>Auf der gleichen Folie steht: z_n ≡ λfx.f^n(x)<br />
Moment mal, plötzlich ist der gebundene Parameter f eine Funktion oder was?</p>
<p>Folie 43: Beispiele für Zahlen<br />
------------------------------<br />
Meinen wir die Zahl Drei (z_3), so schreiben wir also:<br />
(λfx.f(f(f(x)))<br />
Irgendwie geht dieser Term davon aus, dass x = 0 ist? Aber wo steht das geschrieben? Ich meine ich kann ja an einer Mathprüfung auch nicht einfach einer Funktion eine uninitialisierte Variable x übergeben und anschliessend (Bei der Prüfungsbesprechung) behaupten, x wäre natürlich 3.1415 gewesen, das wäre doch klar...</p>
<p>Folie 10 Funktionsapplikation:<br />
------------------------------<br />
F A beutet, dass die Funktion F auf den Ausdruck A angewandt wird.</p>
<p>Wieso schreibt man nun plötzlich überall: 3 ≡ λfx.f(f(f(x))) ?<br />
Müsste es dann nicht wenn schon: 3 ≡ λfx.(f (f (f x))) geschrieben sein?</p>
<p>Ich hoffe, ihr seht was ich meine?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1839885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1839885</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Sat, 16 Jan 2010 18:05:44 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Sat, 16 Jan 2010 18:09:49 GMT]]></title><description><![CDATA[<p>Christoph schrieb:</p>
<blockquote>
<p>Oh, zum Lambda-Kalkül darf natürlich eine Seite nicht fehlen: <a href="http://worrydream.com/AlligatorEggs/" rel="nofollow">Alligator Eggs!</a>. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Musste gerade lachen. Den kannte ich nicht.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1839891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1839891</guid><dc:creator><![CDATA[µngbd]]></dc:creator><pubDate>Sat, 16 Jan 2010 18:09:49 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Sat, 16 Jan 2010 18:14:34 GMT]]></title><description><![CDATA[<p>Ishildur  schrieb:</p>
<blockquote>
<p>Meinen wir die Zahl Drei (z_3), so schreiben wir also:<br />
(λfx.f(f(f(x)))</p>
</blockquote>
<p>Ich hab mit der Lambda-Syntax auch immer wieder meine Probleme. Ist das das gleiche wie:</p>
<pre><code>; Lisp
(lambda (f x)
  (f (f (f x))))
</code></pre>
<p>?<br />
Wenn ja, soll dann für 'f' die Funktion für den Nachfolger übergeben werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1839893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1839893</guid><dc:creator><![CDATA[µngbd]]></dc:creator><pubDate>Sat, 16 Jan 2010 18:14:34 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Sat, 16 Jan 2010 18:29:17 GMT]]></title><description><![CDATA[<p>Ja davon gehe ich aus, aber eben, wie man es dreht und wendet, bei all diesen abstrusen Lambda Termen sehe ich einfach, dass am Ende noch Funktionen übrig bleiben, die nicht definiert sind... weil sie offenbar mit dem Lambda Kalkül schlicht nicht definierbar sind. Da heissts dann einfach &quot;f&quot; und lässt völlig offen, was f genau macht resp. was f für eine Abbildung ist =&gt; Weil man es schlicht nicht definieren kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1839896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1839896</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Sat, 16 Jan 2010 18:29:17 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Sat, 16 Jan 2010 18:50:32 GMT]]></title><description><![CDATA[<p>Ishildur  schrieb:</p>
<blockquote>
<p>weil sie offenbar mit dem Lambda Kalkül schlicht nicht definierbar sind.</p>
</blockquote>
<p>Ich muss leider mit dir auf die Erklärung warten. Aber dass sie nicht definierbar sind, muss falsch sein; Beweis:</p>
<p>In irgendeinem fühen Lisp-Paper werden Zahlen in unärer Weise in Lisp dargestellt, also zB die Zahl 3 als Liste mit Länge 3. Nachdem man die Cons-Zellen aus Lisp aber auf Funktionen abbilden kann (Beispiele in SICP und Wikipedia), müssen diese Dinge irgendwie im Lambda-Kalkül machbar sein.</p>
<p>Abgesehen davon werd ich mal bis auf was Konkreteres abwarten.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1839900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1839900</guid><dc:creator><![CDATA[µngbd]]></dc:creator><pubDate>Sat, 16 Jan 2010 18:50:32 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Sat, 16 Jan 2010 20:39:32 GMT]]></title><description><![CDATA[<p>@µngbd<br />
Hehe, ja ich warte auch gespannt... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1839937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1839937</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Sat, 16 Jan 2010 20:39:32 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Sun, 17 Jan 2010 02:02:42 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p>Ja davon gehe ich aus, aber eben, wie man es dreht und wendet, bei all diesen abstrusen Lambda Termen sehe ich einfach, dass am Ende noch Funktionen übrig bleiben, die nicht definiert sind... weil sie offenbar mit dem Lambda Kalkül schlicht nicht definierbar sind. Da heissts dann einfach &quot;f&quot; und lässt völlig offen, was f genau macht resp. was f für eine Abbildung ist =&gt; Weil man es schlicht nicht definieren kann?</p>
</blockquote>
<p>Im Lambda-Kalkül muss man Funktionen nicht unbedingt aufrufen, um darüber zu reden. Das Endergebnis, die Zahl 3 in deinem Fall, <em>ist</em> die Funktion (λfx.f(f(f(x))).</p>
<p>Mathematisch ist das kein Problem, weil Funktionen Objekte sind, die man vergleichen kann. Nur wenn man zu nah an einer Programmiersprache bleibt, kann man Funktionen nicht sinnvoll vergleichen. Einfaches Beispiel in C++ wäre ein Header mit den beiden Deklarationen:</p>
<pre><code class="language-cpp">int f(int x);
int g(int x);
</code></pre>
<p>Auch wenn du weißt, dass f und g beide keine Seiteneffekte haben (d.h. kein I/O, keine globalen oder statischen Variablen, etc.), kannst du innerhalb einer cpp-Datei mit Standard-C++ nicht entscheiden, ob f die gleiche Funktion wie g ist. Denn &quot;Gleichheit&quot; bei Funktionen ist meistens definiert als: f(x) = g(x) für alle x. Nur wer garantiert, dass f(x) und g(x) für alle Werte von x terminieren?</p>
<p>Das Problem der nicht-terminierenden Funktionen hast du auch schon im lambda-Kalkül. Versuch z.B. mal den Term (λx.(x x))(λx.(x x)) auszuwerten.</p>
<p>Oft betrachtet man den Lambda-Kalkül als Hilfsmittel für andere Dinge. Dann führt man wirklich Funktionen ein, die innerhalb des reinen Lambda-Kalküls nicht (nützlich) definierbar sind, wie zum Beispiel &quot;if&quot; oder eben primitive Datentypen wie &quot;int&quot;.</p>
<p>Sobald du jedenfalls die Möglichkeit nicht-terminierender Funktionen hast, kannst du innerhalb einer Programmiersprache Funktionen nicht mehr auf Gleichheit testen. In Lisp zum Beispiel wirst du keine Möglichkeit finden, zwei Funktionen auf Gleichheit zu testen, auch wenn beide frei von Seiteneffekten sind.</p>
<p>Im reinen Lambda-Kalkül betrachtet man aber dennoch (λfx.f(f(f(x))) als Darstellung der natürlichen Zahl 3. Diesen lambda-Term muss man nicht anwenden, um 3 zu bekommen, dieser lambda-Term ist schon die Darstellung der Zahl 3.<br />
Wenn der Lambda-Kalkül aber nur ein Hilfsmittel in einer Programmiersprache ist, wird man diesen lambda-Term wahrscheinlich auf &quot;successor&quot; und &quot;0&quot; anwenden wollen, um eine nützlichere Darstellung der Zahl 3 zu bekommen.</p>
<p>edit: Bisschen was durcheinandergebracht.</p>
<p>(Nur der Vollständigkeit halber: Was ich oben &quot;mathematisch&quot; genannt habe, heißt normalerweise &quot;denotationale Semantik&quot;.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840011</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Sun, 17 Jan 2010 02:02:42 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Sun, 17 Jan 2010 12:16:11 GMT]]></title><description><![CDATA[<p>Christoph schrieb:</p>
<blockquote>
<p>Mathematisch ist das kein Problem, weil Funktionen Objekte sind, die man vergleichen kann. Nur wenn man zu nah an einer Programmiersprache bleibt, kann man Funktionen nicht sinnvoll vergleichen.</p>
</blockquote>
<p>Wie vergleicht man denn Funktionen im Lambda-Kalkül? Da stellen sich einige Probleme auf. Man definiert ja die Gleichheit folgendermaßen: f=g &lt;=&gt; forall h fh=gh.<br />
Erstes Problem: Das ist ja rekursiv definiert. Ist das überhaupt *wohldefiniert*?<br />
Zweites Problem: Falls ja, ist diese Definition berechenbar, d.h. kann es überhaupt eine Funktion im Lambda-Kalkül geben, die zwei Funktionen vergleicht? (Wäre AFAICS äquivalent zum Halteproblem.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840115</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sun, 17 Jan 2010 12:16:11 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Sun, 17 Jan 2010 12:41:22 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Christoph schrieb:</p>
<blockquote>
<p>Mathematisch ist das kein Problem, weil Funktionen Objekte sind, die man vergleichen kann. Nur wenn man zu nah an einer Programmiersprache bleibt, kann man Funktionen nicht sinnvoll vergleichen.</p>
</blockquote>
<p>Wie vergleicht man denn Funktionen im Lambda-Kalkül? Da stellen sich einige Probleme auf. Man definiert ja die Gleichheit folgendermaßen: f=g &lt;=&gt; forall h fh=gh.<br />
Erstes Problem: Das ist ja rekursiv definiert. Ist das überhaupt *wohldefiniert*?</p>
</blockquote>
<p>Das ist genau das Problem, eine denotationale Semantik zu finden.</p>
<p>Eine denotationale Semantik ordnet jedem lambda-Term ein mathematisches Objekt (Funktion) zu, die man dann auf natürliche Weise vergleichen kann. Die Schwierigkeit liegt darin, so eine Zuordnung &quot;lambda-Term -&gt; mathematisches Objekt&quot; zu finden. Ich hab das mal beim typisiertem lambda-Kalkül mit Basistyp &quot;integer&quot; gesehen; dort lief es darauf hinaus, für jeden Typ eine spezielle partiell geordnete Menge zu definieren und jeden Term auf ein Objekt der vom Typ passenden Menge abzubilden.</p>
<p>Die Menge vom Typ &quot;nat&quot; (natürliche Zahlen) war $$\mathbb{N} \cup {\bot}$$, wobei $$\bot$$ die Semantik des nicht-terminierenden Programms ist. Die partielle Ordnung darauf ist:<br />
Für $$n \in \mathbb{N}$$ gilt $$\bot &lt; n$$ und für nichts sonst gilt $$a &lt; b$$.</p>
<p>Die Menge vom Typ &quot;nat -&gt; nat&quot; war dann definiert als die Menge aller stetigen Funktionen von &quot;nat&quot; nach &quot;nat&quot;. Stetigkeit bedeutet hier, dass die Funktion gerichtete Suprema erhält (<a href="http://en.wikipedia.org/wiki/Scott_continuity" rel="nofollow">Continuity</a>).</p>
<p>Alles in allem wird das eine relativ aufwendige Konstruktion, vor allem, wenn man möchte, dass die denotationale Semantik bestimmte Eigenschaften hat.</p>
<p>Bashar schrieb:</p>
<blockquote>
<p>Zweites Problem: Falls ja, ist diese Definition berechenbar, d.h. kann es überhaupt eine Funktion im Lambda-Kalkül geben, die zwei Funktionen vergleicht? (Wäre AFAICS äquivalent zum Halteproblem.)</p>
</blockquote>
<p>Stimmt. Berechenbar wird die Gleichheit nicht werden, auch wenn man eine gute denotationale Semantik gefunden hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840129</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Sun, 17 Jan 2010 12:41:22 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Sun, 17 Jan 2010 12:51:15 GMT]]></title><description><![CDATA[<p>Christoph schrieb:</p>
<blockquote>
<p>Eine denotationale Semantik ordnet jedem lambda-Term ein mathematisches Objekt (Funktion) zu, die man dann auf natürliche Weise vergleichen kann.[...]</p>
<p>Die Menge vom Typ &quot;nat -&gt; nat&quot; war dann definiert als die Menge aller stetigen Funktionen von &quot;nat&quot; nach &quot;nat&quot;. Stetigkeit bedeutet hier, dass die Funktion gerichtete Suprema erhält (<a href="http://en.wikipedia.org/wiki/Scott_continuity" rel="nofollow">Continuity</a>).</p>
</blockquote>
<p>Uff, da muss ich erstmal schlucken. Aber danke, das sieht sehr interessant aus, kommt definitiv auf die TODO-Liste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840137</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sun, 17 Jan 2010 12:51:15 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Sun, 17 Jan 2010 13:06:27 GMT]]></title><description><![CDATA[<p>Lambda ist ne Weile her bei mir, aber ich versuche es mal.</p>
<p>Ishildur schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21632">@knivil</a><br />
Folie 42: Natürliche Zahlen<br />
------------------------------<br />
F^n(A) (die n-malige Anwendung von F auf A) wird induktiv blah blah blah...<br />
Ok, das verstehe ich, aber wo steht geschrieben, dass F den Wert A um genau 1 inkrementiert?</p>
</blockquote>
<p>Nirgens. Du musst dich von der mathematischen Sichtweise von Funktionen ein bisschen lösen und im Kalkül denken. Es gibt keine Zahlen. Es gibt Objekte und Terme aus solchen Objekten, die ich nach den bekannten Regeln umschreiben darf. Um nun Zahlen zu modellieren macht man einfach folgendes, man einigt sich auf eine Kodierung durch die im Kalkül vorhandenen Objekte. Dafür gibt es dann aber auch verschiedene Varianten.<br />
Analog dazu ist die Turingmaschine. Diese hat auch nur ein Bandalphabet und keine Zahlen in dem Sinne zur Verfügung. Auch dort einigen wir uns auf eine Kodierung der Zahlen um ein Problem zu lösen. Z.B. a = 1, aa = 2, etc ...</p>
<p>Ishildur schrieb:</p>
<blockquote>
<p>Auf der gleichen Folie steht: z_n ≡ λfx.f^n(x)<br />
Moment mal, plötzlich ist der gebundene Parameter f eine Funktion oder was?</p>
</blockquote>
<p>Da wir uns im ungetypten Kalkül bewegen, kann ein gebundener Parameter grundsätzlich jeder beliebige Term sein, denn du kannst jeden beliebigen Term applizieren. Wenn du nun einen Term mit gebundenen Variablen als Funktion interpretierst und diesen applizierst, ja dann ist f eine Funktion. An der Stelle glaube zumindest ich, dass die Interpretation einer Zahl als Funktion die n mal auf sich selbst angewendet wird zwar ein schönes Bild ist, aber nicht 100% stimmt. In Wirklichkeit sagen wir dort einfach, die Zahl n hat folgende Form. Wenn wir dann nach 20 Umformungen mal etwas in dieser Form übrig haben, können wir das Ergebnis wieder als Zahl interpretieren.</p>
<p>Ishildur schrieb:</p>
<blockquote>
<p>Folie 43: Beispiele für Zahlen<br />
------------------------------<br />
Meinen wir die Zahl Drei (z_3), so schreiben wir also:<br />
(λfx.f(f(f(x)))<br />
Irgendwie geht dieser Term davon aus, dass x = 0 ist? Aber wo steht das geschrieben? Ich meine ich kann ja an einer Mathprüfung auch nicht einfach einer Funktion eine uninitialisierte Variable x übergeben und anschliessend (Bei der Prüfungsbesprechung) behaupten, x wäre natürlich 3.1415 gewesen, das wäre doch klar...</p>
</blockquote>
<p>Der Term geht davon aus, das x eben x ist. Applizieren wir da noch was drauf, bekommen wir höchst wahrscheinlich einen Term, der sich nichtmehr als Zahl interpretieren lässt. Eine Variable steht im Lambda Kalkül nicht für eine Zahl sondern ist einfach ein Objekt (Das sich dann natürlich abhängig von seiner Form interpretieren lässt).</p>
<p>Ishildur schrieb:</p>
<blockquote>
<p>Folie 10 Funktionsapplikation:<br />
------------------------------<br />
F A beutet, dass die Funktion F auf den Ausdruck A angewandt wird.</p>
</blockquote>
<p>Wird in der Regel so interpretiert.</p>
<p>Ishildur schrieb:</p>
<blockquote>
<p>Wieso schreibt man nun plötzlich überall: 3 ≡ λfx.f(f(f(x))) ?<br />
Müsste es dann nicht wenn schon: 3 ≡ λfx.(f (f (f x))) geschrieben sein?</p>
</blockquote>
<p>Das ist beides äquivalent. Wir können fx.(f (f (f x))) auch als fx.f (f (f x)) schreiben, denn es gibt eine Regel, wie in so einem Fall der Term zu interpretieren ist. Diese besagt, dass alles was rechts vom Punkt kommt zusammengehört, soweit wie möglich. Will man etwas anderes müsste man eben Klammern setzen. Schließlich kannst du jederzeit statt x ein (x) schreiben und wir sind bei fx.f (f (f (x))). Ich bevorzuge aber auch deine Klammerweise.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840144</guid><dc:creator><![CDATA[HyperSonic]]></dc:creator><pubDate>Sun, 17 Jan 2010 13:06:27 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Sun, 17 Jan 2010 13:42:45 GMT]]></title><description><![CDATA[<p>Verständnisfrage:</p>
<p>Die Zahl 3 sei <code>(λfx.f(f(f(x)))</code> . Kann ich das in Analogie sehen zu dem, was manche Interpreter &quot;introspektiv&quot; nennen? Also Interpreter, die eine Möglichkeit bieten, in ein Objekt hineinzuschauen, zB wenn's eine Funktion ist, die Definition oder die &quot;geclosurten&quot; Werte zu sehen. Mit so einer Möglichkeit könnte ich nämlich durchaus in manchen Fällen prüfen, ob zwei Funktionen gleich sind, zB sind sie gleich, wenn ihre Definitionen gleich sind.</p>
<p>Stimmt das zumindest ein bisschen?<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840165</guid><dc:creator><![CDATA[µngbd]]></dc:creator><pubDate>Sun, 17 Jan 2010 13:42:45 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Sun, 17 Jan 2010 14:16:12 GMT]]></title><description><![CDATA[<p>µngbd schrieb:</p>
<blockquote>
<p>Verständnisfrage:</p>
<p>Die Zahl 3 sei <code>(λfx.f(f(f(x)))</code> . Kann ich das in Analogie sehen zu dem, was manche Interpreter &quot;introspektiv&quot; nennen? Also Interpreter, die eine Möglichkeit bieten, in ein Objekt hineinzuschauen, zB wenn's eine Funktion ist, die Definition oder die &quot;geclosurten&quot; Werte zu sehen. Mit so einer Möglichkeit könnte ich nämlich durchaus in manchen Fällen prüfen, ob zwei Funktionen gleich sind, zB sind sie gleich, wenn ihre Definitionen gleich sind.</p>
</blockquote>
<p>Ja, das geht im Prinzip. Man kann in C++ z.B. auch Funktionszeiger vergleichen und sagen &quot;wenn die gleich sind, sind die Funktionen gleich&quot;. Das sind alles Äquivalenzrelationen, aber aus mathematischer Sicht sind die eben nur selten nützlich.</p>
<p>Man kann auch im lambda-Kalkül die Zahl 3 direkt darstellen oder als 1+1+1 schreiben, mit der Funktion für Addition. Ein Interpreter, der in den Code einer Funktion hineinschauen kann, wird diese beiden Darstellungen erstmal als unterschiedlich ansehen, obwohl beide dieselbe Zahl beschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840195</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Sun, 17 Jan 2010 14:16:12 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Mon, 18 Jan 2010 14:29:45 GMT]]></title><description><![CDATA[<blockquote>
<p>Wie vergleicht man denn Funktionen im Lambda-Kalkül?</p>
</blockquote>
<p>Es gibt keinen Algorithmus, der entscheiden kann, ob zwei beliebige Lambda-Ausdruecke aequivalent sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840678</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 18 Jan 2010 14:29:45 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Mon, 18 Jan 2010 14:02:36 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Es gibt keinen Algorithmus, der entscheiden kann, ob zwei Lambda-Ausdruecke aequivalent sind.</p>
</blockquote>
<p>Es gibt keinen Algorithmus, der <em>in jedem Fall</em> entscheiden kann, ob zwei Lambda-Ausdruecke aequivalent sind.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840756</guid><dc:creator><![CDATA[µngbd]]></dc:creator><pubDate>Mon, 18 Jan 2010 14:02:36 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Mon, 18 Jan 2010 14:30:27 GMT]]></title><description><![CDATA[<p>Um ehrlich zu sein, habe ich auch ueber den Zusatz nachgedacht. Entschied mich aber dagegen, da &quot;zwei Lambda-Ausdruecke&quot; schon allgemein genug ist. Fuer dich habe ich es aber noch kurz hineineditiert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840771</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 18 Jan 2010 14:30:27 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Mon, 18 Jan 2010 17:09:44 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Fuer dich habe ich es aber noch kurz hineineditiert. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Das finde ich nett.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840893</guid><dc:creator><![CDATA[µngbd]]></dc:creator><pubDate>Mon, 18 Jan 2010 17:09:44 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Wed, 20 Jan 2010 22:27:56 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21632">@knivil</a> &amp; µngbd<br />
Hei ihr beiden, ich habe da noch eine Frage zum Lambda Kalkül, die ich nicht verstehe:</p>
<p>λx.(λx.xx)</p>
<p>1. Welches x innerhalb des Funktionskörpers der rechten Funktion ist denn nun an den Parameter der linken Funktion gebunden?</p>
<p>2. Was bedeutet überhaupt xx?<br />
Ich meine, es ist weder ein Symbol, noch eine Applikation? Müsste es nicht vielmehr x x heissen oder ist xx OK?</p>
<p>Vielen Danke für eure Geduld</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1842312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842312</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Wed, 20 Jan 2010 22:27:56 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Wed, 20 Jan 2010 22:41:28 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p>λx.(λx.xx)</p>
<p>1. Welches x innerhalb des Funktionskörpers der rechten Funktion ist denn nun an den Parameter der linken Funktion gebunden?</p>
</blockquote>
<p>Es zählt immer die innerste lambda-Abstraktion. Deswegen ist &quot;λx.(λx.xx)&quot; das gleiche wie &quot;λy.(λx.xx)&quot;.</p>
<p>Ishildur schrieb:</p>
<blockquote>
<p>2. Was bedeutet überhaupt xx?<br />
Ich meine, es ist weder ein Symbol, noch eine Applikation? Müsste es nicht vielmehr x x heissen oder ist xx OK?</p>
</blockquote>
<p>Variablen bestehen in der Mathematik per Konvention immer aus einem Buchstaben (fast immer). Deswegen ist &quot;xx&quot; zu lesen als &quot;x x&quot;, die Anwendungs der Funktion &quot;x&quot; auf den Parameter &quot;x&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1842317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842317</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Wed, 20 Jan 2010 22:41:28 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Wed, 20 Jan 2010 23:15:21 GMT]]></title><description><![CDATA[<blockquote>
<p>&quot;λx.(λx.xx)&quot; das gleiche wie &quot;λy.(λx.xx)&quot;.</p>
</blockquote>
<p>Bist du dir da ganz sicher? Sollte das y nicht auch in der rechten Funktion vorkommen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1842332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842332</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Wed, 20 Jan 2010 23:15:21 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Wed, 20 Jan 2010 23:54:37 GMT]]></title><description><![CDATA[<p>Ishildur schrieb:</p>
<blockquote>
<p>Sollte das y nicht auch in der rechten Funktion vorkommen?</p>
</blockquote>
<p>Schwer zu sagen, oft schon. Man kann aber natürlich auch Argumente ignorieren, und muss das afaik auch manchmal tun.</p>
<p>Wenn <code>xx</code> eine Variable sein soll, wäre sie frei, und müsste irgendwo im Kontext zu finden sein (oder sie ist absichtlich frei, damit sie in irgendeinem Kontext passend festgelegt wird).</p>
<p>Christophs Interpretation halte ich für wahrscheinlicher, das könnte man durchaus maschinell interpretieren, Scheme: <code>(lambda (x) (x x))</code> , in CL braucht man wahrscheinlich noch ein <code>funcall</code> . Das könnte man sicher sinnvoll verwenden, zB für den Y-Kombinator.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1842353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842353</guid><dc:creator><![CDATA[µngbd]]></dc:creator><pubDate>Wed, 20 Jan 2010 23:54:37 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Kalkül on Thu, 21 Jan 2010 00:01:27 GMT]]></title><description><![CDATA[<p>Ich stelle die Frage mal anders:<br />
λxy.xy &lt;=&gt; [λx.(λy.yx) od. λx.(λy.xy)]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1842356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1842356</guid><dc:creator><![CDATA[Ishildur]]></dc:creator><pubDate>Thu, 21 Jan 2010 00:01:27 GMT</pubDate></item></channel></rss>