Il s'agit de la représentation de calcul de la Lambda pour l'opérateur et l'opérateur: peut-on aider à comprendre cette représentation? p> p>
3 Réponses :
En fait, c'est un peu plus que le seul et l'opérateur. C'est la version Dans la Lambda Calculus True est représenté comme une fonction prenant deux arguments * et renvoyant le premier. FAUX est représenté comme fonction prenant deux arguments * et renvoyant la seconde. P>
La fonction que vous avez montrée ci-dessus prend quatre arguments *. De l'apparence de celui-ci m et n sont censés être des booléens et A et B d'autres valeurs. Si M est vrai, il évaluera à son premier argument qui est Donc, fondamentalement, la fonction renvoie A si M et N sont VRAI et B sinon. P>
(*) où "prenant deux arguments" signifie "prendre un argument et renvoyer une fonction qui prend un autre argument". P>
Modifier en réponse à votre commentaire: P>
La première étape consiste simplement à remplacer chaque identifiant avec sa définition, c'est-à-dire de la Lambda Calculus si M et N puis a d'autre B code>. Voici l'explication: p>
n a b code>. Cela évaluera à son tour à un si N est vrai et b si N est faux. Si m est faux, il évaluera à son deuxième argument b. P>
et true faux code> comme on le voit sur la page wiki fonctionne comme ceci: p>
(λm.λn. m n m) (λa.λb. a) (λa.λb. b) code>. Maintenant, la fonction
(λm.λn. M n m) code> est appliqué. Cela signifie que chaque occurrence de M dans
mnm code> est remplacée par le premier argument (
(λa.λb. A) code>) et chaque occurrence de n est remplacée par le deuxième argument (
(λa.λb. B) code>). Nous obtenons donc
(λa.λb. A) (λa.λb. b) (λa.λb. a) code>. Maintenant, nous appliquons simplement la fonction
(λa.λb. A) code>. Étant donné que le corps de cette fonction est simplement un, c'est-à-dire le premier argument, cela évalue à
(λa.λb. B) code>, c'est-à-dire
false code> (comme
λx.λy . Y code> signifie
false code>). p>
@sepp: Pouvez-vous m'aider, si vous le pouvez avec le 2e commentaire posté par moi ci-dessous pour Peter?
Comprendre comment représenter les booléens dans le calcul de Lambda, il est utile de penser à une expression IF, "si a alors b au bien c". C'est une expression qui choisit la première branche, B, si elle est vraie et la seconde, c, si elle est fausse. Les expressions Lambda peuvent le faire très facilement:
if m then (if n then a else b) else b
Merci beaucoup !!! Je trouve que Lambda Calculus est vraiment difficile à comprendre et de telles explications rendent ma vie beaucoup plus facile !! Merci encore.
@Peter: Juste une autre aide nécessaire, si vous le pouvez: je lis je lis les booléens de l'église sur Wikipedia: FR. wikipedia.org/wiki/church_encodinging#church_boolsans Je ne suis pas en mesure de comprendre comment les exemples sont déduits, c'est-à-dire et vrai faux. Pouvez-vous m'aider à les comprendre?
Le moyen de comprendre ces longues expressions est juste de se souvenir des règles et de les évaluer une étape à la fois, de gauche à droite. Donc dans l'expression (λm.λn. Mnm) (λa.λb. a) (λa.λb. b) code> La première partie entre parenthèses est une fonction, et les deuxième et troisième parties sont substituées pour M et N:
(λa.λb. a) (λa.λb. b) (λa.λb. a) code>. Ensuite, faites la même chose à nouveau, en vous rappelant que les A et B de chaque parenthèse sont complètement indépendants les uns des autres. La première partie,
(λa.λb. A) code>, retourne le premier de ses deux arguments. Donc, il renvoie
(λa.λb. B) code>, qui est la représentation de l'église de faux.
Super Peter !!! Merci beaucoup. Avez-vous appris que Lambda Calculus à l'école ou vous lisez une documentation pour obtenir ce niveau de compréhension? En outre, une autre question que j'ai: (Lambda (a) (Lambda (b) ((Lambda (c) c) b))) Dans ce cas, est l'extérieur "C" de "(Lambda (C) c)" " une variable libre ou une variable délimitée ??
Je pense que j'ai vu pour la première fois Lambdas dans un livre sur Lisp, puis un livre sur la sémantique dénotationnelle. Je ne me souviens pas où les booléens entrèrent, mais j'ai eu beaucoup de plaisir à reconstruire comment ils travaillaient après avoir oublié! En savourant que c'est le secret de la comprendre. Pour votre question, l'extérieur "C" est lié, car il est nommé dans la partie "Lambda (C)".
Woww !! C'est vraiment génial que tu te souviens encore ... merci beaucoup pour votre aide Peter !!
Dans le calcul de la Lambda, un booléen est représenté par une fonction qui prend deux arguments, une pour réussir et une échec. Les arguments sont appelés les continuations em>, car ils continuent avec le reste du calcul; Le Boolean True appelle la poursuite du succès et le faux Boolean appelle la poursuite des échecs. Ce codage s'appelle l'encodage de l'église, et l'idée est qu'un booléen est très comme une fonction "si-alors-else". afin que nous puissions dire p> où J'espère que vous pouvez voir où il s'agit Aller. Comment pouvons-nous coder seulement celles-ci sont des fonctions, de sorte que p> mais, la construction ternaire , lors de la codée dans le calcul de la Lambda, est simplement une application de fonction, nous avons donc p> alors nous arrivons enfin à p> Et si nous renommerons les continuations de succès et de défaillance à comme avec Autres calculs dans le calcul de Lambda, en particulier lors de l'utilisation de codages de l'église, s code> signifie SUCCESS,
f code> signifie une défaillance et la barre oblique inverse est une ASCII Lambda. P>
et code>? Eh bien, en C, nous pourrions l'élargir à p>
A CODE> et
B CODE> Nous revenons à votre original p>