| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 不一样的“人工智能语言”Prolog -> 正文阅读 |
|
[人工智能]不一样的“人工智能语言”Prolog |
刚发布的八月份的 TIOBE 排行榜前 20,赫然出现了上古人工智能语言 Prolog! TIOBE 说到:“And, even more astonishing, we see Prolog re-entering the top 20 after 15 years… making an unexpected comeback.” (图片来自 TIOBE Index for August 2021) 时隔十余年,这个独特的语言居然又出现在了大家眼前,排名仅次于 Go!还不快学起来! 如果你学不动了,就请跟上我的脚步,今天,我们从一个清新脱俗的例子出发,领略这门不一样的“人工智能语言”。 另外,我们还做了一个和本文配套的 Prolog 入门视频,欢迎大家观看。如果视频对你有所帮助,别忘了一键三连哦:) (从脚本到音乐到剪辑全是自己做的,大家支持一下吧:) Prolog
(这段文字取自一个如今犹在的上古网站 Prolog 人工智能语言中文论坛 首页的一个醒目位置) 这是一首发人深思的好诗!但你可能很难想象这居然是一种「编程语言」。 回顾编程语言的发展,有可以分为几个时期。
可能小伙伴们对编程语言的了解就止步这里了。但其实我们在几十年前就已经有了——
今天说「人工智能」你肯定想到 Python,但 Python 并不是第五代的人工智能语言。而 Prolog 就是这种没落十余年的第五代编程语言之一。 今天我们的重点不是谈为什么第五代编程语言集体没落,而是来学习这种上古语言 Prolog。 PrologProlog 这个词来自 PROgramming of LOGic,也就是逻辑编程的意思。Prolog 不需要你编写程序运行过程,你只要给出事实和规则,它会自动分析其中的逻辑关系。然后你就可以通过查询,让 Prolog 完成复杂的逻辑运算。 SWI-PrologProlog 有非常多的实现,维基百科甚至专门有个词条比较不同的 Prolog 实现: 这里我们采用 SWI-Prolog——一个十分完善、仍在开发、维护的开源实现。在 macOS 中,可以用
Debian 系 Linux 也可以用 如果你不想或难以完成安装,SWI-Prolog 还为你准备了 在线版本。 安装完成之后,通过
国际惯例,先写 Hello World:
注意 Prolog 的语句最后以 要退出 SWI-Prolog,可以摁 Prolog 基础语法与我们平时接触的其他基于变量的编程语言不同,Prolog 的基础是
这几个概念就是字面意思,如
在 Prolog 中事实和规则和在一起组成了知识库(Knowledge base),我们把这两者写在后缀名为 查询写在 REPL 中,基于已知知识库,对某个问题进行逻辑推理,给出答案。 事实例如,假定我们知道一些事实(字面意思)是:
在 Prolog 中,这些个事实表示为:
我们可以把这个写到一个 在 Prolog 中,小写字母开头的单词是常量,表示一个对象,如 注意,喜欢这种事情是单向的。A 喜欢 B 不代表 B 喜欢 A(如 kaneishi 与 yomogi),所以这里为了表示 yomogi 与 yume 相互喜欢,必须写两句。 我们把
规则现在我们制订一个规则:
规则在 Prolog 表示为
(这行代码也写到 这行代码表示,如果
在 Prolog 中的或与非:
查询前面的事实和规则都是定义,就是我们告诉 Prolog 一些已知信息。查询才是重头戏,就是让 Prolog 帮我们做逻辑题目。 使用
或者,也可以用 然后,如果我们想知道 yomogi 是否喜欢 yume,就可以问 Prolog:
结果
前面这几次查询都是询问某个关系是否成立,也就是看看某个「事实」是否存在。而结合已定义
通过已知的 like 关系(事实),结合我们给的 lover 定义(规则),Prolog 可以推理:
如果只是这样,只会判断个对错,那 Prolog 就太弱了。在 Prolog 查询中还可以使用变量。 例如,我们想要知道
这里 这里 Prolog 所做的操作其实就是解个方程,得到使查询结果为真的变量值: Prolog 中大写字母开头的单词是变量。(注意,Prolog 中变量大写、常量小写,和我们通常的 C 语言编程习惯是反的。)如果写错了大小写,意思就不对了,尝试查询:
如果我们要查询 「yume 是否喜欢 yomogi」,而把 yume 写成了大写的 Yume,就变成了查询「喜欢 yomogi 的人是谁」:
这里 Yume 等于 Who,只是个变量,表示喜欢 yomogi 的人,而不是 对于这种有多个结果的查询。SWI-Prolog 默认每次只显示一个结果,然后等待,我们需要摁下 这里还想补充一点,Prolog 中有一个很有用的谓词
例:苏格拉底会不会死?利用前面这些知识,就可以解决很多逻辑问题了,例如,已知:
所以可以退出结论:苏格拉底会死。 用 Prolog 来解决这个问题:
如果你觉得一个完整的程序不能只包括逻辑运算部分,还必须拥有输入输出,那么,结合 hello world 中的 write,我们可以实现:
然后再解释器中调用:
这就得到了一些生命有限的凡人。 利用这种「逻辑编程」你还可以写成更多有趣的例子。如果你觉得这个例子已经理解不能了,那我推荐你重新学习一下基础的《数理逻辑》(很多《离散数学》书的第一章)。 到这里,我们其实只是看到了 Prolog 的最简单的用法,但完全没有接触到 Prolog 中真正强大的地方,例如递归,这些就写另一篇更深入的文章来进一步学习了,——不过我们现在这篇文章到此就结束了。 参考[1] Blackburn, Patrick and Bos, Johan and Striegnitz, Kristina. Learn Prolog Now!. College Publications. 2006 [2] 阮一峰. Prolog 语言入门教程. 阮一峰的网络日志. 2019 [3] SWI Prolog. Getting Started. [4] Draveness. Prolog 基础 <1>. draveness.me, 2015 [5] 作者未知. Prolog 入门教程. 垂钓听竹轩. 2004 (最后这篇是我近10年前学习 Prolog 时看的文章,写的非常易懂。但如今网络上只有这篇的多手转载,以及其翻译的英文原文了,很难找到这份珍贵的中文译本,目前我只是找到了它最早可能是来自一个叫垂钓听竹轩的网站,但这个网站关了, archive.org 里的备份全是 3xx 错误,,有空我再考古一下了)
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 22:30:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |