如何将逻辑子句转换为 LEAN?

How can I convert logical clause to LEAN?

我有这样一个逻辑子句:

exists l.(language(l) & exists n.(name(n) & :op1(n,"English") & :name(l,n)))

对应于表达式:“语言是英语”

子句由变量(l,n)、谓词(language, name, op1)和常量("English")组成。每个变量首先分配给它对应的 class(l 分配给“语言”,n 分配给“名称”)然后 class 的实例用于进一步推理(:op1 是一个谓词将常量“英语”分配给 class“语言”的实例。或者它可以被视为 class“语言”的 属性。

有没有办法将其转换为 LEAN 代码?

您可以通过多种方式将其映射到精益中,这在很大程度上取决于您想要准确建模的内容。无论如何,这是一种可能性。

精益使用类型理论,类型理论和一阶逻辑之间的一个区别是量化总是受类型的限制,而不是有一个普遍的论域。也许最惯用的写法是

namespace lang_ex

inductive language
| english

def name : language → string
| language.english := "English"

end lang_ex

这定义了一个名为 language 的新类型,它有一个名为 language.english 的居民,它定义了一个函数 name,它接受类型为 language 的东西并产生一个string(代表您的 name class)。该函数的规则是给定 language.english 时它的值是“English”。

这些指令的作用或多或少是定义了以下公理:

namespace lang_ex

constant language : Type
constant language.english : language
constant name : language → string
axiom name_english : name language.english = "English"

end lang_ex

constantaxiom 之间没有区别——它们都是公理化地介绍事物。)在精益中,函数应用语法是并列的,所以 name language.english 而不是 name(language.english).


这里有一种不惯用的写法,尽可能紧跟您的子句:

namespace lang_ex

constant univ : Type
constant is_language : univ → Prop
constant is_name : univ → Prop
constant op1 : univ → string → Prop
constant name : univ → univ → Prop

axiom clause :
  ∃ (l : univ), is_language l ∧
    ∃ (n : univ), is_name n ∧ op1 n "English" ∧ name l n

end lang_ex