我有一个这样的逻辑子句:
exists l.(language(l) & exists n.(name(n) & :op1(n,"English") & :name(l,n)))
其对应于表达式:";语言是英语;
子句由变量(l,n(、谓词(language,name,op1(和常量("English"(组成。每个变量首先被分配给其对应的类(l被分配给"语言",n被分配到"名称"(,然后类的实例被用于进一步的推理(:op1是一个谓词,将常数"英语"分配给类的实例"语言"。或者它可以被视为类的一个属性"语言"(。
有没有办法将其转换为LEAN代码?
有很多方法可以将其映射到精益中,这在很大程度上取决于您想要精确建模的内容。无论如何,这里有一种可能性。
Lean使用类型理论,类型理论和一阶逻辑之间的一个区别是,量化总是受一个类型的限制,而不是有一个通用的话语领域。也许写这篇文章最惯用的方式是作为
namespace lang_ex
inductive language
| english
def name : language → string
| language.english := "English"
end lang_ex
这定义了一个名为language
的新类型,该类型有一个称为language.english
的居民,并且它定义了函数name
,该函数接受类型为language
的东西并生成string
(代表您的name
类(。该函数的规则是,当给定CCD_ 7时;英语";。
这些指令或多或少地定义了以下公理:
namespace lang_ex
constant language : Type
constant language.english : language
constant name : language → string
axiom name_english : name language.english = "English"
end lang_ex
(constant
和axiom
没有区别——它们都是公理化的。(在Lean中,函数应用程序语法是并置的,所以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