2016-04-07 42 views
2

下面的函數編譯:理解`K:納特** 5 * K = N`簽名

onlyModByFive : (n : Nat) -> (k : Nat ** 5 * k = n) -> Nat 
onlyModByFive n k = 100 

但到底是什麼k代表其Nat ** 5 * k = n語法?

另外,我怎樣稱呼它?這是我的嘗試,但我不明白輸出。答案的

*Test> onlyModByFive 5 5 
When checking an application of function Main.onlyModByFive: 
     (k : Nat ** plus k (plus k (plus k (plus k (plus k 0)))) = 5) is not a 
     numeric type 

源 - https://groups.google.com/d/msg/idris-lang/ZPi9wCd95FY/eo3tRijGAAAJ

回答

5

(k : Nat) ** (5 * k = n)是從屬對由

  • 第一元件k : Nat
  • 第二元件prf : 5 * k = n

換句話說,這是一種存在類型,表示「存在一些k : Nat,例如5 * k = n」。建設性的,你必須給出這樣一個k和證明它確實滿足5 * k = n

在你的榜樣,如果部分應用onlyModByFive5,你會得到類型

onlyModModByFive 5 : ((k : Nat) ** (5 * k = 5)) -> Nat 

的東西,所以第二個參數必須是(k : Nat) ** (5 * k = 5)類型。只有一種選擇的k我們可以在這裏做,將其設置爲1,並且證明5 * 1 = 5

foo : Nat 
foo = onlyModByFive 5 (1 ** Refl) 

這工作,因爲5 * 1減少了5,所以我們必須證明5 = 5,可平凡完成直接使用Refl : a = a(統一a ~ 5)。

+0

謝謝,仙人掌。但是我認爲我的'onlyModByFive'的def是無效的,因爲它根本不涉及'mod',不是嗎?我問了這個後續:http://stackoverflow.com/questions/36531852/function-to-determine-if-nat-i​​s-divisible-by-5-at-compile-time。 –

+0

另外 - 你可以請你推薦任何你已經注意到與證明有關的'Refl'的讀物嗎? –

+2

@KevinMeredith您可以先閱讀http://jozefg.bitbucket.org/posts/2014-08-06-equality.html,並注意到我們正在討論這裏的內涵命題平等。 – Cactus