10
votes

Requête sur Booleans à Lambda Calculus

Il s'agit de la représentation de calcul de la Lambda pour l'opérateur et l'opérateur: xxx

peut-on aider à comprendre cette représentation?


0 commentaires

3 Réponses :


4
votes

En fait, c'est un peu plus que le seul et l'opérateur. C'est la version de la Lambda Calculus si M et N puis a d'autre B . Voici l'explication:

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.

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 n a b . 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.

Donc, fondamentalement, la fonction renvoie A si M et N sont VRAI et B sinon.

(*) où "prenant deux arguments" signifie "prendre un argument et renvoyer une fonction qui prend un autre argument".

Modifier en réponse à votre commentaire:

et true faux comme on le voit sur la page wiki fonctionne comme ceci:

La première étape consiste simplement à remplacer chaque identifiant avec sa définition, c'est-à-dire (λm.λn. m n m) (λa.λb. a) (λa.λb. b) . Maintenant, la fonction (λm.λn. M n m) est appliqué. Cela signifie que chaque occurrence de M dans mnm est remplacée par le premier argument ( (λa.λb. A) ) et chaque occurrence de n est remplacée par le deuxième argument ( (λa.λb. B) ). Nous obtenons donc (λa.λb. A) (λa.λb. b) (λa.λb. a) . Maintenant, nous appliquons simplement la fonction (λa.λb. A) . Étant donné que le corps de cette fonction est simplement un, c'est-à-dire le premier argument, cela évalue à (λa.λb. B) , c'est-à-dire false (comme λx.λy . Y signifie false ).


1 commentaires

@sepp: Pouvez-vous m'aider, si vous le pouvez avec le 2e commentaire posté par moi ci-dessous pour Peter?



13
votes

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


6 commentaires

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) 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) . 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) , retourne le premier de ses deux arguments. Donc, il renvoie (λa.λb. B) , 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 !!



8
votes

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 , 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 xxx

s signifie SUCCESS, f signifie une défaillance et la barre oblique inverse est une ASCII Lambda.

J'espère que vous pouvez voir où il s'agit Aller. Comment pouvons-nous coder et ? Eh bien, en C, nous pourrions l'élargir à xxx

seulement celles-ci sont des fonctions, de sorte que xxx

mais, la construction ternaire , lors de la codée dans le calcul de la Lambda, est simplement une application de fonction, nous avons donc xxx

alors nous arrivons enfin à xxx

Et si nous renommerons les continuations de succès et de défaillance à A et B Nous revenons à votre original xxx

comme avec Autres calculs dans le calcul de Lambda, en particulier lors de l'utilisation de codages de l'église, Il est souvent plus facile de travailler avec des lois algébriques et de raisonnement équivalent, puis convertissez-la à la fin.


0 commentaires