Prolog系列学习-1

本文介绍了作者在阅读《七周七语言》时对Prolog的初次体验,强调了Prolog与其他语言的不同之处。通过一个关于人物关系的推理问题,展示了Prolog如何描述事实和规则,并解释了Prolog程序的运行方式。作者提供了问题的Prolog解决方案,并演示了如何在Prolog环境中询问和获取答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近枕头书是《七周七语言:理解多种编程范型》这本,前面两章分别看了Ruby和IO,都是命令式语言。虽然它们在语法上跟之前接触过的C,C#,Java这些C家族的语言差别很大,但是编程范型却是一致的。Ruby是纯面向对象的一门语言,再熟悉不过了,IO是基于原型的语言,之前也稍微接触过javascript所以理解起来也不会太困难,也正是因为命令式语言、面向对象之前经常接触,所以虽然这两门语言对我来说很新鲜但是却是没有达到让我很兴奋,很激动(大多数时候是因为没看懂。兴奋点也还是有的,比如Ruby中的method_missing,IO中的yield)。

昨天晚上看到Prolog的时候终于让我有了“初恋”的感觉,迫不及待的想试试手,以前我们了解一门语言写的第一个程序基本都是Hello World,但是对于Prolog来说Hello World确实无法体现它的特点,所以我们……先看一张图吧:

我本不是一个爱八卦的人,今天就为了Prolog八一八吧,这张图看似复杂其实一根跟连线描述的都是一个个事实,以程序员的思维换成像下面这样来描述应该都是能够理解的:

复制代码

旧爱(王菲,窦唯)
旧爱(王菲,谢霆锋)
旧爱(李亚鹏,周迅)
旧爱(李亚朋,瞿颖)
旧爱(周迅,朴树)
旧爱(周迅,李大齐)
旧爱(周迅,窦鹏)
旧爱(chenguanxi,张柏芝)
绯闻(谢霆锋,周迅)
离异(王菲,李亚鹏)
离异(王菲,窦唯)
离异(张柏芝,谢霆锋)
离异(张亚东,窦颖)
旧友(chenguanxi,谢霆锋)

复制代码

每一行都描述了两个人事实上的关系。面对这些关系,我想很多人都有很多问题或者说是猜测。试想王菲和李亚鹏离婚后有一天在大街上撞上周迅,王菲会是什么样的一种眼神。我假设满足下面这种情况都存在这样的眼神:

如果甲和乙已经离异,乙和丙曾经相爱,那么甲就会以一种特殊的眼神看丙。

那么上面这个人物关系中,哪些人之间会存在这种情况呢?下面我们用Prolog来描述这个问题,首先将那些事实用Prolog进行描述(:Prolog不能有中文,小写开头代表符号,大小或下划线开头代表变量):

复制代码

jiuai(wangfei,douwei).
jiuai(wangfei,xietingfeng).
jiuai(liyapeng,zhouxun).
jiuai(liyapeng,quyin).
jiuai(zhouxun,pushu).
jiuai(zhouxun,lidaqi).
jiuai(zhouxun,doupeng).
jiuai(chengguanxi,zhangbozhi).
liyi(wangfei,liyapeng).
liyi(wangfei,douwei).
liyi(zhangbozhi,xietingfeng).
liyi(zhangyadong,douyin).
jiuyou(chenguanxi,xietingfeng).

复制代码

注意:每行结束的“.”是必须的,在Prolog中它标识着一个事实的结束。上面那条的规则在Prolog是这样描述的:

yanshen(X,Y):- liyi(X,Z),jiuai(Z,Y).

“:-”表示如果的意思,“,”表示且的关系,同样末尾的句点不能省略。这句话的意思是“如果X和Z离异了,并且Z和Y是旧爱的关系,那么X就会以一种特殊的眼神看Y”。

好了代码写好了,将上面的代码保存成yansen.pl。你可能很好奇这样的代码是怎么运行的?不要着急得下载安装一下Prolog的运行环境,可以使用GNU Prolog,点这里。我安装的是compiled under x86_64 / Windows 7 with MinGW64 gcc under Cygwi。安装后是下面这样一个界面:

选择File-->Consult...打开yanshen.pl文件:

如图出现yes就说明编译成功了,下面就到了我们运行程序的时候了,运行Prolog程序其实是一个问问题的过程。“上面这个人物关系中,哪些人之间会存在这种眼神?”我们可以这样问:

yanshen(Who1,Who2).

答案是:王菲和周迅,王菲和瞿颖。(:使用;号进行追问直到没有结果了会返回no)。

我们也可以这样问:“王菲会以这样的眼神看谁?”

yanshen(wangfei,Who).

还可以这样问:“谁看周迅会有这种眼神?”

yanshen(Who,zhouxun).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值