无法形成一个证明者公理

时间:2015-05-25 22:01:15

标签: theorem-proving

我试图向Prover9教授基本集理论。以下成员资格的定义似乎很有效(第二个公理只是使列表无序):

member(x,[x:y]).
[x,y]=[y,x].

有了这个,我可以让Prover9证明是复杂的'像member([A,B],[C,[A,B]])和其他人一样。 但是,当我使用它来定义子集时,我必须做错事:

subset(x,y) <-> (member(z,x) -> member(z,y)).

Prover9将其归为subset(x,y) | -member(z,y),并使用它来证明虚假条款,例如subset([A],[B,C])。 我错过了什么?

1 个答案:

答案 0 :(得分:1)

你的“第二个公理......只是为了使列表无序”看起来很可疑。

注意[x,y]是一个双元素列表。所以你的公理对一般的列表一无所知。您的“复杂”示例仍然是2元素列表。所以不是很复杂。我想你将无法证明member(A, [C, B, A])

对比你的第一个公理中的[x:y]是一个1或更多元素的列表。 y可能是零,或者可能是任意数量的元素。 IOW y是一个列表,而在[x,y]中,y是列表的元素。

参见http://www.cs.unm.edu/~mccune/prover9/manual/2009-11A/,'条款&amp;公式'在'列表符号'。

我会去:

member(x, [x:y]).
member(x, z) -> member(x, [y:z]).

(但这定义了一个包,而不是一套。)

  

我认为变量的量化是一个红色的鲱鱼。

编辑: Errk。我错了。所以我不知道为什么我得到这个结果:

  

@Doug指向的示例不需要定量z'内'   等价的rhs。你可以删除所有显式   量化,证明仍然有效。

行。让我们按照手册'条款&amp; amp;来应用重写规则。公式'在“如果输入了非条件公式......”。

子集的定义是等价的(又称双重含义);重写为两个独立的公理:“前进”和“后退”的含义;使用p -> q ==&gt;重写每一个-p | q

在“前进”方向,我们得到:

-subset(x, y) | (member(z, x) -> member(z, y)).

无论z是量化的还是宽的,都无关紧要。

在'向后'方向:

-(member(z, x) -> member(z, y)) | subset(x, y).

如果我们在蕴涵中狭隘地量化z,那就在否定范围内;和整个公式的量化不同。

结论:您对member( )subset( )的定义都是错误的。

BTW您确定需要定义member吗?证明@Doug指向仅将member(x,y)作为原始。