首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在FStar中解决这类冲突?

如何在FStar中解决这类冲突?
EN

Stack Overflow用户
提问于 2020-05-18 10:26:51
回答 1查看 49关注 0票数 0

下面是一个简单的模式生成器,它返回一个1:nat列表。lemma_1证明了在生成的任意长度列表的每个位置上都有1。必须引入nth_1lng参数,因为否则n将被约束为n:nat{n < length lst},从而导致与lemma_1中的n (其类型为n:nat{n < lng} )之间的类型冲突。如果没有额外的参数,怎么能解决这个问题?

代码语言:javascript
复制
val length: list 'a -> nat
let rec length lst = 
match lst with
  | [] -> 0
  | _ :: t -> 1 + length t

val nth_1 : lst: list nat {length lst > 0} -> (lng: nat) -> n: nat {n < lng} -> nat
let rec nth_1 lst lng n =
  match lst with
  | [h] -> h
  | h :: t -> if n = 0 then h else nth_1 t (lng - 1) (n - 1)

val gen_1 : lng: nat {lng > 0} -> list nat
let rec gen_1 lng =
match lng with 
  | 1 -> [1]
  | _ -> 1 :: gen_1 (lng - 1)

let rec lemma_1 (lng: nat {lng > 0}) (n: nat {n < lng})  : Lemma ((nth_1 (gen_1 lng) lng n) = 1) =
match n with
  | 0 -> ()
  | _ -> lemma_1 (lng - 1) (n - 1)

问题似乎与gen_1模式不能为零长度的约束有关。是否有更好的方法来表达这个标准?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-18 11:13:14

以下是避免额外参数的一种方法(请参见内联注释):

代码语言:javascript
复制
module Test

val length: list α → ℕ
let rec length lst =
match lst with
  | [] → 0
  | _ ⸬ t → 1 + length t

//the refinement on n is not really necessary here, the proofs work even without it
//because as soon as we have [h], irrespective of the value of n, we return h
val nth_1 : lst: list ℕ {length lst > 0} → n: ℕ{n < length lst} → ℕ
let rec nth_1 lst n =
  match lst with
  | [h] → h
  | h ⸬ t → if n = 0 then h else nth_1 t (n - 1)

//refine the return type to say that it returns a list of length lng
val gen_1 : lng: pos → (l:list ℕ{length l == lng})
let rec gen_1 lng =
match lng with
  | 1 → [1]
  | _ → 1 ⸬ gen_1 (lng - 1)

let rec lemma_1 (lng: pos) (n: ℕ {n < lng})  : Lemma ((nth_1 (gen_1 lng) n) = 1) =
match n with
  | 0 → ()
  | _ → lemma_1 (lng - 1) (n - 1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61867488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档