如何在 Coq 中定义 arg max

问题描述 投票:0回答:1

我是 Coq 新手。我对定义递归函数感兴趣

c(k)
。基本情况
c(0)
是常数 0。给定
c(k)
,有
a(k+1, i) = g(i, c(k))
,其中
g
是一个函数,以及
c(k+1) = a(k+1, j)
,其中
j = arg max h(a(k+1, i))
在所有
0 <= i <= T
上,
h
是另一个函数,并且
T
i
的上限。
c(k)
a(k)
都是自然数。索引是自然数。我一直在定义
arg max
运算符。

这是我的草图:

(* The upper bound of i *)
Parameter T : nat.
Parameter g : nat -> nat -> nat.
Parameter h : nat -> nat.

Fixpoint c (k : nat) : nat :=
  match k with
  | 0 => 0
  | S k' => a k j  (* ?? *)
  with
Fixpoint a (k i : nat) : nat :=
  match k with
  | 0 => 0
  | S k' => g i (c k')
  end.

我向 GPT 询问了这个问题,它建议我首先找到

h(a(k+1, i))
超过
i
的最大值,然后搜索产生该最大值的特定
i
。显然这不起作用,因为搜索产生了 nat 选项,但我知道
arg max
不是一个选项。

非常感谢!

coq
1个回答
0
投票

ChatGPT 在这里并不遥远。 搜索会返回

option nat
,因为您可能正在搜索不存在的值。 但您知道该值存在,因此您知道搜索将始终返回
Some x
形式的值。 根据这些知识,您可以通过以下形式的函数运行搜索结果来安全地摆脱异常情况。

Definition discard_option (x : option nat) : nat :=
  match x with Some x => x | _ => 0 end.

在证明代码的属性时,您必须证明

find
(可用于搜索正确值的函数)当然永远不会返回
None

© www.soinside.com 2019 - 2024. All rights reserved.