2013-04-19 7 views

答えて

4

ウルリッヒNeumerkelにより、Prologのラムダ実装があります。たとえば、SWI-Prologがそれをサポートしています。あなたはstackoverflowので検索した場合:

[swi-prolog] lambda 

あなたはまた、ソリューションのためにそれを使用してかなりの数の答えを見つけることができます。また

、すべての supported backend Prolog compilersへのラムダ式が使用できるようになり explains it all

+1

ウルリッヒのラムダライブラリーは、Prologの実装ではなく、*のISO * Prologの実装である(たとえば、非ISO標準述語strip_module/3と非ISO標準ディレクティブmeta_predicate/1を使用します)。また、モジュールのISO Prolog標準に準拠していないモジュールシステムをサポートするPrologコンパイラも必要です。 –

+0

@PauloMoura訂正ありがとう! –

+1

@PauloMoura:[この実装](http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/ISO-Hiord#implementation)をお読みください!また、strip_module/3もmeta_predicateもモジュール参照も含まれていません。あなたが言及するSWIの実装には、あなたが言及したSWIの実装特有の機能をいくつか考慮に入れています。しかし、あなたが逃したものはさらにあります。 – false

2

を プロローグでのラムダ式のために周りの二つのアプローチ、その唯一のアドレスは基本的にあります。ラムダ式の呼び出しと 上位統一:

  • グローバル・バイ・デフォルト:彼らは余分なバインダーで に言及されていない場合は、ラムダ 式の本体内変数は、デフォルトでグローバルです。

  • ローカル・バイ・デフォルト:彼らは余分なバインダーで言及 されていない場合、ラムダ 式の本体内変数は、デフォルトでローカルです。ローカル・バイ・デフォルトの

代表は、例えばウルリッヒNeumerkelの ライブラリー(ラムダ)またはLogtalkで見つかったラムダ式です。 デフォルトによるグローバル・アプローチの後に、Jekejeke Prologのラムダ の式が続きます。

両方のアプローチは、以下のような問題点を同じ数学的なラムダ 表現をモデル化し、解決することができます:共有や 複数の呼び出し間での変数の非共有の

  • コントロール。

  • バインダーとローカル変数のアルファ変換を強制的にラムダ式の本体に入れます。 ここ

は一例であり、Yコンビネータを介し階乗:

  • グローバル・バイ・デフォルト:JekejekeプロローグAPISource
 
    ?- Y = F\X^call(X\call(F,call(X,X)),X\call(F,call(X,X))), 
     Fact = F\J^H^M^N^N\J^H^M^M\J^H^(N=0,M=1;N>0,H is N-1,call(F,H,J),M is N*J), 
     call(Y,Fact,10,R). 
    R = 3628800. 
 
    ?- Y = \F^call([F]+\X^call(F,call(X,X)),[F]+\X^call(F,call(X,X))), 
     Fact = \F^([F]+\N^([N,F]+\M^(N=0,M=1;N>0,H is N-1,call(F,H,J),M is N*J))), 
     call(Y,Fact,10,R). 
    R = 3628800. 

さようなら

PS:
言語機能とアーキテクチャ
B-プロローグのNENG-FA:バイ・デフォルト・グローバルとローカル・バイ・デフォルト区別が ページ10、から借りています論理プログラミングの周、理論と実践、2011
http://www.sci.brooklyn.cuny.edu/~zhou/papers/tplp11sips.pdf