Pyke 逻辑编程入门(5):模式匹配 之“模式变量”


模式变量
进一步说,你或许要问:“谁是 Thomas 的 Norma 的儿子?”。这时,你把 Thomas 和 Norma 输入 Pyke,要它的回答多点内容,不仅仅是“对”、“错”。
模式变量用做输出变量。形式上以美元符号 $ 开头:
family.son_of($son, Thomas, Norma)

在符号 $ 后面,可以用任何名字。Pyke 会正确地把 $son 约束成 Bruce。你若对此答复不满意,可以拒绝它,并要求 Pyke 给出新的回答(“不行,请继续查找!”)。 Pyke 若又发现 Thomas 和 Norma 的儿子,它会承认你是正确的,并把 $son 约束成别的某个值。

若 Pyke 告诉你的是 Thomas 和 Norma 的最后一个儿子,而你拒绝这个答复,Pyke 会对你说:“你错了”。

我们告诉 Pyke “不行,请继续查找!”之后,Pyke 首先会解脱模式变量 $son 的约束值,接着去寻找新的约束值。

任何时候,模式变量的值,或被约束或被解脱。如果我们跟踪模式变量,会看到:在 Pyke 尝试寻找适当答案的过程中,模式变量一会儿被约束,一会儿被解脱。一旦寻找失败,$son 即解脱。

匿名模式变量

假定我们想了解谁是 Norma 的儿子,但不关心儿子的父亲。这时,用匿名变量取代这位父亲。

匿名变量可以是任何类型。匿名变量的名字,开头字符是下划线(_),其余字符无关紧要,顶多有点文档助记的作用。不过符号 $ 必不可少。

于是,“谁是 Norma 的儿子?”这个问题的 Pyke 表示,是这样的:

family.son_of($son, $_father, Norma)

这里的参数 Norma,是输入 Pyke 的, $son 是从 Pyke 的输出, $_father 则是告知 Pyke,谁是父亲可以忽略不计。

匿名变量,从不约束值。或者说,从不赋值给它,它总是自由的。

模式变量的同一化

请注意!这个问题非常重要。名称相同的模式变量,是同一变量。比如,你写出的两个 $son,是同一个变量。模式变量,在某一时刻,只能约束为一个值,两个相同值同时出现,要用同名变量,书写在两个地方。


注 意
匿名变量不适用同一化操作,因为,它们从不约束值、没有值,并且可以匹配任何数据值。

你若想了解与其父亲同名的儿子有多少,应该这样询问:


family.son_of($father, $father, $_mother)

注 意
例程 family_relations 中没有父子同名的,因为这会分不清谁是父亲、儿子、女儿,造成混乱。

因此,例程中儿子的名字是唯一的。

在例程中这样提问,结果总会失败。

 

现在说说,模式变量是如何与数据值匹配合一的。

首先,检验模式变量是否已经约束了值。

若已经约束了值,则把它与数据的值比对,若一致,则匹配成功。

若尚未约束值,则把数据的值与其匹配合一,这种匹配总会成功。

模式变量在未受约束 时,可与任何值合一匹配。匹配后,变量约束了那个值。这也是匹配的副作用。模式变量在约束了值以后,只能与完全相同的值匹配,很像个文字模式。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值