模式变量
模式变量用做输出变量。形式上以美元符号 $ 开头:
在符号 $ 后面,可以用任何名字。Pyke 会正确地把 $son 约束成 Bruce。你若对此答复不满意,可以拒绝它,并要求 Pyke 给出新的回答(“不行,请继续查找!”)。 Pyke 若又发现 Thomas 和 Norma 的儿子,它会承认你是正确的,并把 $son 约束成别的某个值。
若 Pyke 告诉你的是 Thomas 和 Norma 的最后一个儿子,而你拒绝这个答复,Pyke 会对你说:“你错了”。
我们告诉 Pyke “不行,请继续查找!”之后,Pyke 首先会解脱模式变量 $son 的约束值,接着去寻找新的约束值。任何时候,模式变量的值,或被约束或被解脱。如果我们跟踪模式变量,会看到:在 Pyke 尝试寻找适当答案的过程中,模式变量一会儿被约束,一会儿被解脱。一旦寻找失败,$son 即解脱。
匿名模式变量
假定我们想了解谁是 Norma 的儿子,但不关心儿子的父亲。这时,用匿名变量取代这位父亲。
匿名变量可以是任何类型。匿名变量的名字,开头字符是下划线(_),其余字符无关紧要,顶多有点文档助记的作用。不过符号 $ 必不可少。
于是,“谁是 Norma 的儿子?”这个问题的 Pyke 表示,是这样的:
这里的参数 Norma,是输入 Pyke 的, $son 是从 Pyke 的输出, $_father 则是告知 Pyke,谁是父亲可以忽略不计。
匿名变量,从不约束值。或者说,从不赋值给它,它总是自由的。
模式变量的同一化
请注意!这个问题非常重要。名称相同的模式变量,是同一变量。比如,你写出的两个 $son,是同一个变量。模式变量,在某一时刻,只能约束为一个值,两个相同值同时出现,要用同名变量,书写在两个地方。
你若想了解与其父亲同名的儿子有多少,应该这样询问:
因此,例程中儿子的名字是唯一的。
在例程中这样提问,结果总会失败。
现在说说,模式变量是如何与数据值匹配合一的。
首先,检验模式变量是否已经约束了值。
若已经约束了值,则把它与数据的值比对,若一致,则匹配成功。
若尚未约束值,则把数据的值与其匹配合一,这种匹配总会成功。
模式变量在未受约束 时,可与任何值合一匹配。匹配后,变量约束了那个值。这也是匹配的副作用。模式变量在约束了值以后,只能与完全相同的值匹配,很像个文字模式。