3.5 独立变量和赋值
在我们的模型,上下文的使用对应的是为变量赋值。这是一个从独立变量到域中实体的映射。赋值使用构造函数Assignment
,它也以论述的模型的域为参数。我们无需实际输入任何绑定,但如果我们要这样做,它们是以(变量,值)的形式来绑定,类似于我们前面看到的估值。
>>> g = nltk.Assignment(dom, [('x', 'o'), ('y', 'c')])
>>> g
{'y': 'c', 'x': 'o'}
此外,还可以使用print()
查看赋值,使用与逻辑教科书中经常出现的符号类似的符号:
>>> print(g)
g[c/y][o/x]
现在让我们看看如何为一阶逻辑的原子公式估值。首先,我们创建了一个模型,然后调用evaluate()
方法来计算真值。
>>> m = nltk.Model(dom, val)
>>> m.evaluate('see(olive, y)', g)
True
这里发生了什么?我们正在为一个公式估值,类似于我们前面的例子see(olive, cyril)
。然而,当解释函数遇到变量y
时,不是检查val
中的值,它在变量赋值g
中查询这个变量的值:
>>> g['y']
'c'
由于我们已经知道o
和c
在 see 关系中表示的含义,所以True
值是我们所期望的。在这种情况下,我们可以说赋值g
满足公式see(olive, y)
。相比之下,下面的公式相对g
的评估结果为False
(检查为什么会是你看到的这样)。
>>> m.evaluate('see(y, x)', g)
False
在我们的方法中(虽然不是标准的一阶逻辑),变量赋值是部分的。例如,g
中除了x
和y
没有其它变量。方法purge()
清除一个赋值中所有的绑定。
>>> g.purge()
>>> g
{}
如果我们现在尝试为公式,如see(olive, y)
,相对于g
估值,就像试图解释一个包含一个 him 的句子,我们不知道 him 指什么。在这种情况下,估值函数未能提供一个真值。
>>> m.evaluate('see(olive, y)', g)
'Undefined'
由于我们的模型已经包含了解释布尔运算的规则,任意复杂的公式都可以组合和评估。
>>> m.evaluate('see(bertie, olive) & boy(bertie) & -walk(bertie)', g)
True
确定模型中公式的真假的一般过程称为模型检查。