簡體   English   中英

Coall如何實施

[英]How forall is implemented in Coq

在嘗試了解如何在JS或Ruby中實現 forall時,我想知道它在Coq中是如何實際實現的。 也許這將有助於闡明。 我似乎無法通過在Google上搜索來找到定義。 主要只是在源代碼中的某處尋找鏈接。

Coq的forall從屬產品類型 ,不能直接用動態類型化語言(如Javascript)進行編碼,因為它們只是缺少靜態類型的概念。

從某些語言,功能的角度來看,它的目的是為一些荒謬的事物提供靜態類型。 考慮我們有類型T1T2的無限集合...

然后,不能通過常規方法將此函數分配為(非平凡的)類型:

function foo(n) {
  return eval("new T" + n + "()");
}

但是,我們可以使用輔助函數為它提供依賴( forall )類型

function H(n) {
  return eval("T" + n);
}

foo的類型將是所有forall n:Number, H(n) (給定Number,返回類型為H(n)的對象,即Tn )。

不幸的是,我們無法將這些信息傳達給JS解釋器以靜態執行此合同。 但是,我們可以在運行時檢查它!

讓我們從建立一個小的類型檢查框架開始。

function type_number(x) {
  if (typeof x == "number") return x;
  throw new Error("not a number");
}

function type_function(x) {
  if (typeof x == "function") return x;
  throw new Error("not a function");
}

function type_instance(clss) {
  return function (x) {
    if (x instanceof clss) return x;
    throw new Error("not an instance of " + clss);
  };
}

現在我們可以實現一個非依賴函數類型

function type_arrow(arg, ret) {
    return function(f) {
        f = type_function(f);
        return function(x) {
            return ret(f(arg(x)));
        };
    };
}

在這里, arg必須是arg的類型檢查器,而ret必須是返回值的類型檢查器。 例如:

// declare a function from numbers to numbers
var fn1 = type_arrow(type_number, type_number)((x) => x * x);
fn1(10); // works
fn1("asdsa"); // fails

// bad declaration, but, unfortunately, JS cannot possibly catch it at "compilation" time
var fn2 = type_arrow(type_number, type_number)((x) => "Hello!");
fn2(10); // fails, return value is not a number

現在到有趣的部分:

function type_forall(arg, ret) {
    return function(f) {
        f = type_function(f);
        return function(x) {
            var y = f(arg(x));
            return ret(x)(y);
        };
    };
}

注意ret現在是兩個參數的咖喱函數。 給我第一個例子,我們現在可以給foo一個類型:

function T1(){}
function T2(){}
function T3(){}
function T4(){}
function T5(){}
// ...etc

function foo(n) {
    return eval("new T" + n + "()");
}

function H(n) {
    return eval("T" + n);
}

function type_H(n) {
    return type_instance(H(n));
}

var typed_foo = type_forall(type_number, type_H)(foo);
typed_foo(2); // successfully invokes and returns a T2 instance

請注意,我們不能使用type_arrowfoo提供非平凡的類型-我們需要n來正確地對返回值進行類型檢查。

但這遠非Coq所能提供給我們的強大功能,僅僅是因為它在編譯時不會捕獲任何錯誤。 如果您確實需要這些保證,則必須將語言構造具體化為一流對象並執行自己的類型檢查。 我可以推薦的一篇文章是http://augustss.blogspot.com/2007/10/simpler-easier-in-recent-paper-simply.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM