3.5 独立变量和赋值

在我们的模型,上下文的使用对应的是为变量赋值。这是一个从独立变量到域中实体的映射。赋值使用构造函数Assignment,它也以论述的模型的域为参数。我们无需实际输入任何绑定,但如果我们要这样做,它们是以(变量,值)的形式来绑定,类似于我们前面看到的估值。

  1. >>> g = nltk.Assignment(dom, [('x', 'o'), ('y', 'c')])
  2. >>> g
  3. {'y': 'c', 'x': 'o'}

此外,还可以使用print()查看赋值,使用与逻辑教科书中经常出现的符号类似的符号:

  1. >>> print(g)
  2. g[c/y][o/x]

现在让我们看看如何为一阶逻辑的原子公式估值。首先,我们创建了一个模型,然后调用evaluate()方法来计算真值。

  1. >>> m = nltk.Model(dom, val)
  2. >>> m.evaluate('see(olive, y)', g)
  3. True

这里发生了什么?我们正在为一个公式估值,类似于我们前面的例子see(olive, cyril)。然而,当解释函数遇到变量y时,不是检查val中的值,它在变量赋值g中查询这个变量的值:

  1. >>> g['y']
  2. 'c'

由于我们已经知道oc在 see 关系中表示的含义,所以True值是我们所期望的。在这种情况下,我们可以说赋值g满足公式see(olive, y)。相比之下,下面的公式相对g的评估结果为False(检查为什么会是你看到的这样)。

  1. >>> m.evaluate('see(y, x)', g)
  2. False

在我们的方法中(虽然不是标准的一阶逻辑),变量赋值是部分的。例如,g中除了xy没有其它变量。方法purge()清除一个赋值中所有的绑定。

  1. >>> g.purge()
  2. >>> g
  3. {}

如果我们现在尝试为公式,如see(olive, y),相对于g估值,就像试图解释一个包含一个 him 的句子,我们不知道 him 指什么。在这种情况下,估值函数未能提供一个真值。

  1. >>> m.evaluate('see(olive, y)', g)
  2. 'Undefined'

由于我们的模型已经包含了解释布尔运算的规则,任意复杂的公式都可以组合和评估。

  1. >>> m.evaluate('see(bertie, olive) & boy(bertie) & -walk(bertie)', g)
  2. True

确定模型中公式的真假的一般过程称为模型检查。