基于 Coq 中的关系定义函数

Define a function based on a relation in Coq

我正在研究一个理论,其中关系 C 定义为

Parameter Entity: Set.    
Parameter C : Entity -> Entity -> Entity -> Prop.

关系C是一些实体的组合关系。我希望能够写 x o y = z 而不是 C z x y。所以我有两个问题:

我试过 Notation "x o y" := exists u, C u x y. 但没用。有没有办法做我想做的事?

除非你的关系 C 具有 属性,即给定 xy,存在唯一的 z 使得 C z x y,您不能按照您建议的方式将其视为代表 full-fledged 函数。这就是为什么在这种情况下需要关系的概念。

至于为关系属性定义符号,您可以使用:

Notation "x 'o y" := (exists u, C u x y) (at level 10).

注意 o 之前的 ' 以帮助解析器处理 := 符号之后的符号和括号。可以更改级别以适合您的解析首选项。

如果你将x 'o y定义为一个命题,你将失去o是对Entity的二元运算的直觉( x o y 应该有类型 Entity).

你可以写一些像

这样的变体
Notation "x 'o y '= z" := (unique (fun t => C t x y)) (at level 10).

否则,如果你的关系满足:

Hypothesis C_fun: forall x y,  {z : Entity | unique  (fun t => C t x y) z}.

那么你可以定义:

Notation "x 'o y" := (proj1_sig (C_fun x y)) (at level 10).
Check fun a b: Entity =>  a 'o b. 

否则(如果您只有 C_fun 的较弱版本,使用 exists 而不是 sig)并接受使用经典逻辑和公理),您可以使用Epsilon 运算符 https://coq.inria.fr/distrib/current/stdlib/Coq.Logic.ClassicalEpsilon.html