0

我想编写一个函数,强制它的参数在语法上是一个常量字符串。这是我尝试过的:

module Test

module R = FStar.Reflection

let is_literal (t: R.term) =
  match R.inspect_ln t with
  | R.Tv_Const (R.C_String _) -> true
  | _ -> false

let check_literal (s: string { normalize (is_literal (`s)) }) =
  ()

let test () =
  check_literal ""; // should work
  let s = "" in
  check_literal s // should not work

但是,我很确定静态引号(带有 `)不是我想要的,而是带有quote. 但这会将我的先决条件置于 Tac 效应中。在目前的情况下,有什么办法可以做我想做的事吗?

4

1 回答 1

0

我不知道您是否最终找到了解决方案,但是隐式元参数呢?

它们以某种方式允许Tac在函数调用时运行代码,使其quote可用。

稍微改变你的代码似乎可行:

module Is_lit

open FStar.Tactics

let is_literal (t: term) =
  match inspect_ln t with
  | Tv_Const (C_String _) -> true
  | _ -> false

let check_literal (s: string)
                  (#[(if (normalize_term (is_literal (quote s)))
                      then exact (`())
                      else fail "not a litteral")
                    ] witness: unit)
                  : unit =
  ()

// success
let _ = check_literal "hey" 

// failure
[@expect_failure]
let _ = let s = "hey" in check_literal s 
于 2019-06-05T15:49:35.110 回答