Isabelle 伊莎贝尔:验证重言式公式

Isabelle 伊莎贝尔:验证重言式公式,isabelle,hol,Isabelle,Hol,我想在Isabelle中创建一个函数F,给出一个公式 formula = pr int | neg formula | imp formula formula 如果公式是重言式,则为真,否则为假 例如: F( φ ⇒ φ ) = True F( φ ⇒ (ψ ⇒ φ) ) = True F( ψ ⇒ φ ) = False 有人能帮我吗?我发现很难理解Isabelle的文档,而且我找不到这样的函数(我认为它应该已经存在)。在任何情况下,如果你想谈论公式的重言式(或公式的任何语

我想在Isabelle中创建一个函数F,给出一个公式

       formula = pr int | neg formula | imp formula formula 
如果公式是重言式,则为真,否则为假

例如:

F( φ ⇒ φ ) = True
F( φ ⇒ (ψ ⇒ φ) ) = True
F( ψ ⇒ φ ) = False

有人能帮我吗?我发现很难理解Isabelle的文档,而且我找不到这样的函数(我认为它应该已经存在)。

在任何情况下,如果你想谈论公式的重言式(或公式的任何语义属性),你首先需要定义公式的语义,即函数
eval::formula⇒ (int)⇒ (布尔)⇒ bool
(假设
pr
构造函数表示自由变量),它接受公式和变量赋值,并返回公式是否适用于该赋值


您可以通过使用
primrec
fun
命令对公式进行递归来定义此类函数。Isabelle网站上有很多例子。无论如何,如果你想讨论公式的重言式(或公式的任何语义属性),你首先需要定义公式的语义,即函数
eval::formula⇒ (int)⇒ (布尔)⇒ bool
(假设
pr
构造函数表示自由变量),它接受公式和变量赋值,并返回公式是否适用于该赋值



您可以通过使用
primrec
fun
命令对公式进行递归来定义此类函数。我在Isabelle网站上看到了很多这样的例子。

为什么这样的功能已经存在?您自己定义了这个数据类型,并且有许多不同类型的逻辑。当然,你不能期望标准库包含大量深入到Isabelle中的不同逻辑。是的,我定义了这个数据类型,但这基本上是说一个公式是原子的(例如pr1),一个公式的否定(例如neg(pr1))或一个蕴涵(例如imp(pr1)(pr2))因此,我认为Isabelle会有一些东西,对于给定的公式,它会知道该公式对于任何赋值是否正确。正如我在回答中所说的,首先需要公式的语义(函数
eval
)。一旦你有了这些,写下公式重言式的含义是很容易的。我想再补充一点曼努埃尔·埃贝尔的评论和回答,你可能会发现有用的:。这里给出的示例比您的用例稍微复杂一些,但是,希望通过一些努力,您能够从这些示例中推断Isabelle如何用于您的应用程序。为什么这样的函数已经存在?您自己定义了这个数据类型,并且有许多不同类型的逻辑。当然,你不能期望标准库包含大量深入到Isabelle中的不同逻辑。是的,我定义了这个数据类型,但这基本上是说一个公式是原子的(例如pr1),一个公式的否定(例如neg(pr1))或一个蕴涵(例如imp(pr1)(pr2))因此,我认为Isabelle会有一些东西,对于给定的公式,它会知道该公式对于任何赋值是否正确。正如我在回答中所说的,首先需要公式的语义(函数
eval
)。一旦你有了这些,写下公式重言式的含义是很容易的。我想再补充一点曼努埃尔·埃贝尔的评论和回答,你可能会发现有用的:。这里给出的示例比您的用例稍微复杂一些,但是,希望通过一些努力,您能够从这些示例中推断Isabelle如何用于您的应用程序。我不理解为什么函数的形式是eval::formula⇒ (int)⇒ (布尔)⇒ 布尔。我的意思是,你如何定义一个原子公式(pr1)的基本情况。我怎么知道一个原子公式(pr1)对某个赋值有效?我想为不止一个整数定义eval…这就是为什么你们的赋值类型是
int⇒ bool
。它们为每个整数指定一个值。您可以使它更明确,并为赋值指定一个域,但实际上这只会使赋值变得不必要的复杂。通常,您只需将任何您想要的(例如,
False
)分配给所有您不关心的变量。对于基本情况
pri
,定义
eval
很简单:您只需在分配中查找
i
。这可能要求太多,但我看不出在定义eval之后您将如何定义同义反复。您需要检查公式是否适用于每个可能的赋值,对吗?我的意思是,
taut(pra)=False
,“`taut(neg b)=taut b``但是
taut(imp c d)
呢?你只需要正式地写下重言式的定义:对于每个作业,它的计算结果都是
True
。(提示:Isabelle/HOL有一个通用量词
int
bool
),但我认为这足以证明或反驳特定公式的重言式。我不明白为什么函数的形式是eval::formula⇒ (int)⇒ (布尔)⇒ 布尔。我的意思是,你如何定义一个原子公式(pr1)的基本情况。我怎么知道一个原子公式(pr1)对某个赋值有效?我想为不止一个整数定义eval…这就是为什么你们的赋值类型是
int⇒ bool
。它们为每个整数指定一个值。您可以使它更明确,并为赋值指定一个域,但实际上这只会使赋值变得不必要的复杂。通常,您只需将任何您想要的(例如,
False
)分配给所有您不关心的变量。对于基本情况
pri
,定义
eval
很简单:您只需查找