苏格拉底是凡人

时间:2018-02-22 22:42:16

标签: alloy

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

3 个答案:

答案 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

当我们检查这个时,我们得到一个版本,其中苏格拉底是道德而不是男人。

您可以找到html版本here以及此here的来源。这些使用新提出的Alloy 5降价格式。

答案 2 :(得分:0)

另一种选择:

sig Mortal {}
sig Man extends Mortal {}
one sig Socrates extends Man {}

check {Socrates in Mortal}