Prolog教程 11

Prolog的最强大的功能之一就是它内建了模式匹配的算法----联合(Unification)。以前我们所介绍的例子中的联合都是较为简单的。现在来仔细研究一下联合。下表中列出了联合操作的简要情况。

变量&任何项目: 变量可以与任何项目绑定,其中也包括变量
原始项目&原始项目: 两个原始项目(原子或整数)只有当它们相同时才能联合。
结构&结构: 如果两个结构的每个相应的参数能联合,那么这两个结构可以联合。

为了更清楚地介绍联合操作,我们将使用Prolog的内部谓词‘=/2’,此谓词当它的两个参数能够联合时成功,反之则失败。它的语法如下:

=(arg1, arg2)

为了方便阅读,也可以写成如下形式:

arg1 = arg2

注意:此处的等号在Prolog中的意义与其他语言中的不同。它不是数学运算符或者赋值符。

使用=进行联合操作与Prolog使用目标与子句联合时相同。在回溯时,变量将被释放。

下面举了几个最简单的联合的例子。

?- a = a.
yes

?- a = b.
no

?- location(apple, kitchen) = location(apple, kitchen).
yes

?- location(apple, kitchen) = location(pear, kitchen).
no

?- a(b,c(d,e(f,g))) = a(b,c(d,e(f,g))).
yes

?- a(b,c(d,e(f,g))) = a(b,c(d,e(g,f))).
no

在下面的例子中使用的变量,注意变量是如何绑定为某个值的。

?- X = a.
X = a

?- 4 = Y.
Y = 4

?- location(apple, kitchen) = location(apple, X).
X = kitchen

当然也可以同时使用多个变量。

?- location(X,Y) = location(apple, kitchen).
X = apple
Y = kitchen

?- location(apple, X) = location(Y, kitchen).
X = kitchen
Y = apple

变量之间也可以联合。每个变量都对应一个Prolog的内部值。当两个变量之间进行联合时,Prolog就把它们标记为相同的值。在下面的例子中,我们假设Prolog使用‘_nn’,其中‘n’为数字,代表没有绑定的变量。

?- X = Y.
X = _01
Y = _01

?- location(X, kitchen) = location(Y, kitchen).
X = _01
Y = _01

Prolog记住了被绑定在一起的变量,这将在后面的绑定中反映出来,请看下面的例子。

?- X = Y, Y = hello.
X = hello
Y = hello

?- X = Y, a(Z) = a(Y), X = hello.
X = hello
Y = hello
Z = hello

最后的这个例子能够很好地说明Prolog的变量绑定与其他语言中的变量赋值的区别。请仔细分析下面的询问。

?- X = Y, Y = 3, write(X).
3
X = 3
Y = 3

?- X = Y, tastes_yucky(X), write(Y).
broccoli
X = broccoli
Y = broccoli

当两个含变量的结构之间进行联合时,变量所取的值使得这两个结构相同。

?- X = a(b,c).
X = a(b,c)

?- a(b,X) = a(b,c(d,e)).
X = c(d,e)

?- a(b,X) = a(b,c(Y,e)).
X = c(_01,e)
Y = _01

无论多么复杂,Prolog都将准确地记录下变量之间的关系,一旦某个变量绑定为某值,与之有关的变量都将改变。

?- a(b,X) = a(b,c(Y,e)), Y = hello.
X = c(hello, e)
Y = hello

?- food(X,Y) = Z, write(Z), nl, tastes_yucky(X), edible(Y), write(Z). food(_01,_02)
food(broccoli, apple)
X = broccoli
Y = apple
Z = food(broccoli, apple)

如果在两次绑定中变量的值发生冲突,那么目标就失败了。

?- a(b,X) = a(b,c(Y,e)), X = hello.
no

上面的例子中,第二个子目标失败了,因为找不到一个y的值使得hello与c(Y,e)之间能够联合。而下面的例子是成功的。

?- a(b,X) = a(b,c(Y,e)), X = c(hello, e).
X = c(hello, e)
Y = hello

如果变量不能绑定为某一可能的值,那么联合也将失败。

?- a(X) = a(b,c).
no

?- a(b,c,d) = a(X,X,d).
no

下面的这个例子很有趣,请你研究一下吧。

?- a(c,X,X) = a(Y,Y,b).
no

你明白为什么这个例子失败么?第一个参数的绑定使得Y绑定为c,第二个参数之间的绑定告诉Prolog变量X与Y的值相同,那么X也绑定c,而最后一个参数的绑定使得X为b,有矛盾,所以失败了。这就是说没有什么办法能使得这两个结构联合。

匿名变量(_)不会绑定为任何值。所以也不要求它所出现的位置的值必须相同。

?- a(c,X,X) = a(_,_,b).
X = b

如果使用(=)那么联合操作时显式的。而Prolog在使用子句与目标匹配时的联合则是隐式的。

 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Visual Prolog 是一种面向对象的编程语言。它的设计目标是成为一种易学易用的语言,用于开发高度可靠的应用程序和系统。Visual Prolog是一种高级语言,具有强大的抽象能力和丰富的功能。它使用逻辑编程的思想,通过定义事实和规则的方式来描述问题,并使用查询来获取解决方案。Visual Prolog支持图形用户界面开发,使开发人员可以轻松创建交互式和直观的应用程序。 Visual Prolog教程提供了从入门到高级的学习路径。教程涵盖了语言的基础知识和高级特性,如面向对象编程、图形用户界面、数据库访问等。教程开始时介绍了Visual Prolog的基本概念,例如数据类型、变量、操作符等。然后,它介绍了如何使用逻辑编程的思想来解决问题。教程还提供了许多实例和练习,帮助学习者实践所学知识。 Visual Prolog教程还涵盖了如何使用Visual Prolog开发图形用户界面。它介绍了如何使用Visual Prolog的GUI库来创建窗口、按钮、文本框等控件,并将它们组合成交互式的界面。教程还解释了如何处理用户的输入和事件,以及如何使用GUI库提供的功能来实现应用程序的逻辑。 此外,Visual Prolog教程还介绍了如何使用数据库访问功能来操作数据库。它解释了如何连接到数据库、执行查询和更新操作,并处理结果。通过这些教程,学习者可以了解如何使用Visual Prolog开发与数据库交互的应用程序。 总之,Visual Prolog教程提供了详细而全面的学习路径,帮助学习者从入门到精通。无论是初学者还是有一定编程经验的开发人员,都可以通过学习Visual Prolog教程来掌握这种强大的编程语言

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值