如何实现迭代假设的coq策略?

时间:2017-03-10 03:08:55

标签: coq coq-tactic ltac

作为我一般问题的最小例子,假设我们有以下内容:

Parameter C: Prop.

Definition blah := C.

我想实施一种策略,在目标的所有假设中自动展开blah

我试过了:

Ltac my_auto_unfold := repeat match goal with 
  | [ H: ?P |- ?P ] => unfold blah in H
end.


Theorem g: blah -> blah -> blah.
Proof.
intros.
my_auto_unfold.

但只有一个假设展开了blah

2 个答案:

答案 0 :(得分:4)

我认为您可能正在寻找$username = $_POST["username"]; $password = $_POST["password"]; $statement = mysqli_prepare($con, "SELECT * FROM `user` WHERE username= ? AND password = ?"); mysqli_stmt_bind_param($statement, "ss", $username, $password); mysqli_stmt_execute($statement); mysqli_stmt_store_result($statement); mysqli_stmt_bind_result($statement, $userID, $name, $age, $username, $password); $response = array(); $response["success"] = false; while(mysqli_stmt_fetch($statement)){ $response["success"] = true; $response["name"] = $name; $response["username"] = $username; $response["age"] = $age; $response["password"] = $password; } echo json_encode($response); 战术。如果你这样做:

progress

然后它会在两个假设中展开Ltac my_auto_unfold := repeat match goal with | [ H: ?P |- ?P ] => progress unfold blah in H end. 。你甚至可以这样做:

blah

概括了这种模式。请注意,这可能会在每个假设中多次运行策略。

如果你想按顺序遍历所有假设,那么这就更难了(特别是如果你想保留evar上下文而不是在证明术语中添加愚蠢的东西)。这是快速而肮脏的方式(假设你的策略不会弄乱目标):

Ltac in_all_hyps tac :=
    repeat match goal with
           | [ H : _ |- _ ] => progress tac H
           end.

这个想法是你插入一个虚拟标识符来标记你在目标中的位置(即,标记可以引入多少变量),然后将所有上下文恢复到目标中,这样你就可以重新引入上下文一个假设,对你刚才介绍的每个假设运行策略。

答案 1 :(得分:3)

您的代码段的问题是[ H: ?P |- ?P ]在这种情况下始终匹配。它第一次匹配H : blah,第二次匹配H : C - 因为C和blah在Coq中可以转换 - 并且展开不会改变任何内容,从而中止{{1 }}

我会写

repeat

你甚至可以写

Ltac my_auto_unfold nam := repeat lazymatch goal with 
  | [ H : nam |- _ ] => unfold nam in H
end.

Theorem g: blah -> blah -> blah.
Proof.
intros.
my_auto_unfold blah. auto. Qed.

如果你愿意的话。