“大展鸿图”的不变式君子不贪杯这一题,貌似C选项也可以
小树 2025-7-28 18:26
君子不贪杯这题,您给的答案是B,貌似C也可以,要么贪杯,要么君子,我的理解对吗?

UMLChina潘加宇
C不对。你的理解也不对,“要么A,要么B”不是or(或)的意思,而是xor(异或)。
我们设定:
P: 某个人是君子,即oclIsKindOf(君子)
Q: 某个人不贪杯,即24小时内摄入酒精克数<=20
把四个选项用P和Q替换,如下图:

君子不贪杯,意思是:如果一个人是君子,那么他不贪杯,即P→Q。
P→Q 等价于 (not P) or Q,这是逻辑学的基本定义。
也就是B选项。
not oclIsKindOf(君子) or 24小时内摄入酒精克数<=20
C选项
24小时内摄入酒精克数>20 or oclIsKindOf(君子)
相当于(not Q) or P,等价于Q→P,意思是,如果一个人不贪杯,那么他是君子。
这个意思就变掉了,原来的意思,贪杯只是君子的必要条件,现在变成了充分条件。
还可以比较一下真值表,特别注意结果为假的(P,Q)结合

本来我们给类加约束是防止“贪杯的君子”出现,如果改成下面,则变成防止“不贪杯的非君子”出现了。
用无间道的话来说,一个是警察抓内鬼,一个是腐蚀黑帮里的好人。
贪杯不贪杯的可能只是小事情,最近空难较多,我们换成飞机事故看看。
P: 发动机故障
Q: 警报响
真值表如下:

从“杜绝漏报”变成了“杜绝假警报”。
**********
再看你说的“要么贪杯,要么君子”。
根据前面的定义:
P:君子
Q:不贪杯
“要么贪杯,要么君子”相当于 (not Q) xor P。
(not Q) xor P
=((not Q) or P) and not((not Q) and P)
=((not Q) or P) and (Q or (not P))
=((not Q) or P) and ((not P) or Q)
=(Q→P) and (P→Q)
=Q↔P
相当于“君子”和“不贪杯”是双重蕴含的,这个就更严格,既杜绝了“贪杯的君子”,也杜绝了“不贪杯的非君子”。
