All men are mortals.
Socrates is a man.
Therefore, Socrates is a mortal.
在Alloy模型下方表达推理规则。这是表达推理规则的好方法吗?你能提供更好的表达方式吗?
abstract sig man {}
// Socrates is a man
one sig Socrates extends man{}
one sig Plato extends man{}
one sig Aristotle extends man{}
one sig Earthly {
mortals: set man
}
// All men are mortal
fact All_men_are_mortal {
all m: man | m in Earthly.mortals
}
// Therefore, Socrates is mortal
assert Socrates_is_mortal {
Socrates in Earthly.mortals
}
check Socrates_is_mortal
答案 0 :(得分:2)
为了使其更接近自然语言的表述,你可以写下这样的东西:
assert Syllogism {
all Socrates: univ, Man, Mortal: set univ |
-- every man is mortal
Man in Mortal
-- Socrates is a man
and (Socrates in Man)
-- implies Socrates is mortal
implies Socrates in Mortal
}
check Syllogism
答案 1 :(得分:1)
有趣。几个星期前我这样做了。
在你的定义中,你已经说过苏格拉底是一个男人。这基本上使得三段论变得多余,因为你已经说过苏格拉底是一个男人。
我认为你需要一个模型,其中苏格拉底不是男性的定义。
简而言之,我的版本正确使用了三段论
sig Men{}
one sig Socrates {}
check Correct {
all mortal, men : some Men + Socrates {
men in mortal
and
Socrates in men
=> Socrates in mortal
}
} for 5 Men
如果你检查一下,那么没有反例,所以我们似乎没问题。
然而,很容易搞砸了Syllogism's:
这可以在Alloy中完成如下
check Wrong {
all mortal, men : some Men + Socrates {
men in mortal
and
Socrates in mortal
=> Socrates in men
}
} for 5 Men
当我们检查这个时,我们得到一个版本,其中苏格拉底是道德而不是男人。
答案 2 :(得分:0)
另一种选择:
sig Mortal {}
sig Man extends Mortal {}
one sig Socrates extends Man {}
check {Socrates in Mortal}