CでSKIコンビネータできなかったお話

アバター
みょん
記事: 16
登録日時: 12年前
住所: 京都
連絡を取る:

CでSKIコンビネータできなかったお話

投稿記事 by みょん » 12年前

えーと、前回チャーチ数を定義してC言語にSKIコンビネータを組み込んでみよう、とか意気込んでいましたが失敗しました

というか、C言語では直接コンビネータ論理を扱うのは無理でした

というのも、コンビネータにはカリー化という概念が必要で、これは何かというと、
int func(int, int)
という函数があったとき、これは
intとintを受け取ってintを返す函数
と読めます。

ここで、func(3)としたときに、これを
あともう1つだけintを受け取ってintを返す函数
と読むことにします(もちろんC言語の構文ではこのようなことはできません)

さらに、func(3,4)としたときに、これを
もう引数は取らずintだけを返す函数(=値)
と読むことにします

つまり、funcは函数ですがfunc(3)も函数であり、func(3,4)にいたっても函数(定数函数)であると見なします
この考え方がカリー化です
コンビネータにはカリー化があるおかげで函数だけでちゃんとしたプログラムが組めるようになるんですが、残念ながらC言語にカリー化を直接構文として導入することは不可能そうなので、上に書いた通りどうやらCでコンビネータをすることは不可能である、と結論づけました。

というわけでLazy Kを直接実装すること以外に、Cでコンビネータをプログラムとして扱うことは出来そうにありませんでした。。。><
最後に編集したユーザー みょん on 2012年10月16日(火) 20:55 [ 編集 2 回目 ]

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前

Re: CでSKIコンビネータできなかったお話

投稿記事 by Dixq (管理人) » 12年前

みょんさんの日記にいつもコメを書こうとするものの、難しくて脳みそが付いて行かない私です・・。

に・・日本語でおk・・!

関数型言語や論理型言語の類はProlog位しか組んだことが無いですが私には難し過ぎるとです・・。

アバター
みょん
記事: 16
登録日時: 12年前
住所: 京都
連絡を取る:

Re: CでSKIコンビネータできなかったお話

投稿記事 by みょん » 12年前

>キューさん
わざわざコメントありがとうございます><

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前

Re: CでSKIコンビネータできなかったお話

投稿記事 by h2so5 » 12年前

C++だと std::bind や boost::bind による引数束縛ができます

CODE:

#include 
using namespace std;

// intとintを受け取ってintを返す函数
int func(int x, int y)
{
        return x - y;
}
 
int main() {
 
        // あともう1つだけintを受け取ってintを返す函数
        auto func2 = bind(func, 3, placeholders::_1);
        func2(4);
 
        // 引数は取らずintだけを返す函数
        auto func3 = bind(func, 3, 4);
        func3();
 
        return 0;
}
最後に編集したユーザー h2so5 on 2012年10月16日(火) 16:36 [ 編集 3 回目 ]

アバター
みょん
記事: 16
登録日時: 12年前
住所: 京都
連絡を取る:

RE: CでSKIコンビネータできなかったお話

投稿記事 by みょん » 12年前

>h2so5さん

なるほど、C++だと引数束縛が出来るんですね…(引数が過剰の場合の処理がそれで出来るのかという疑問は残りますが)
というか、C++でやりたくなかったのは、C++にはそのままラムダ式が組み込まれているので、
I = λx.x
K = λxy.x
S = λxyz.(x z)(y z)
をそのまま実装すれば終わってしまうから、あまり練習にはならないなぁと思ったのです

結局C言語では無理だという結論だけ出てしまいましたが…><;
もしも機会があれば、C++でLazy Kの実装なんかも面白そうですね〜☆