我试图向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])
。
我错过了什么?
答案 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)
作为原始。