2017-11-20 33 views
4

ブール演算子とNOT演算子のラムダ計算のプログラミング言語を変えて実装したいと考えました。Cでのラムダ計算:ブール演算子とNOT演算子

これらは次のとおりです。

TRUE = lx.ly. x 
FALSE = lx.ly. y 
NOT = lx. x FALSE TRUE 

それはJavascriptとPythonで行うには些細だが

var TRUE = function(x,y){ return x;} 
var FALSE = function(x,y){ return y;} 
var NOT = function(b){ return b(FALSE,TRUE) ; } 

のように、と言うが、私はC.

でそれを行う方法を見つけ出すことはできませんこのようなものを実装する素朴なアイデア

lambda true(lambda x, lambda y){ return x ; } 
lambda false(lambda x, lambda y){ return x ; } 

lambda not(lambda (b)(lambda, lambda)){ return b(false,true) ;} 

は再帰的定義

typedef void (*lambda)(lambda,lambda) ;not valid in C 

Cでそれを行う方法がありますを許可しませんtypedefとして、Cで可能ないないようですか?それを行う方法は教育的な例として使用する意味がありますか?つまり、構文が煩雑になり始めると、その目的を打ち負かすことになります...

最後に、Cがあまりにも制限されすぎると、C++での回答も同じですが、私にとってはうまくいくでしょう「複雑さ」の制約私は

C.

のあまりEDIT期待することができる

:しかし、この:コメント欄でトムの提案に続き を、以下の定義は

typedef void *(*bol)() ; 

bol true(bol x, bol y){ return x ; } 
bol false(bol x, bol y){ return x ; } 

bol not(bol b){ return b(false,true) ;} 



int main(){ 
bol p = not((bol)true); 

return 0; 
} 

EDIT2をコンパイル行います厳密にはありませんトムと他の人が指摘しているように適合しています。

さらに、@Antti Haapala、および@のn.mとして指摘し、これは私がC++で簡単な十分な実装があるかもしれないという懐疑的だ。この時点で

C.

のあまりを尋ねることができます。

+0

コメントは議論の対象外です。この会話は[チャットに移動]されています(http://chat.stackoverflow.com/rooms/159410/discussion-on-question-by-masl-lambda-calculus-in-c-booleans-and-not-operator) 。 – Andy

+0

@Andyこれは悪いタイミングです...遅れています。議論は長らく終わりました。このスレッドは、Tom、n.m.とAntti。これは誰にも役立ちません。 – MASL

+0

ラムダコードを理解するためのミニインタプリタを書くことは容認できますか? –

答えて

1

再帰的な宣言を宣言するためにCで、私が知っている唯一の方法は、このように、構造体を使用することです:私は明らかに少ないクリアなダイナミックよりも、そのような構文があまりにも面倒であるかどうかを判定するためのハード

#include <stdio.h> 
#include <stdarg.h> 

typedef struct LAMBDA { 
    struct LAMBDA * (*function)(struct LAMBDA *, ...); 
} *lambda; 

lambda trueFunction(lambda x, ...) {return x;} 
lambda true = &(struct LAMBDA) {.function = trueFunction}; 

lambda falseFunction(lambda x, ...) {va_list argp; va_start(argp, x); lambda y = va_arg(argp, lambda); va_end(argp); return y;} 
lambda false = &(struct LAMBDA) {.function = falseFunction}; 

lambda notFunction(lambda b, ...) {return b->function(false, true);} 
lambda not = &(struct LAMBDA) {.function = notFunction}; 

int main() { 
    lambda p1 = not->function(true); 
    lambda p2 = not->function(false); 
    printf("%p %p %p %p", true, p1, false, p2); 
    return 0; 
} 

その言語。

+0

ニース。これはTomが提案したもう1つの選択肢です。はい、私は、この例を使用してラムダ計算についてのポイントを作るのは難しいと思うが、シンタックスは途中で始まるが、この場合はstructの使用を示すために+1に値する。メモ:そのprintfは、コードを厳密に準拠させる(gcc -pedantic)ために引数を '' void * '' 'にキャストする必要があります。 – MASL