- 3.5 独立变量和赋值
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
确定模型中公式的真假的一般过程称为模型检查。
