0%

小明的舅舅是谁?

这和计算机有什么关系?

小明的舅舅是谁?突然问这个问题恐怕所有人都会一头雾水,大多数人的第一反应恐怕是:小明是谁???
这个问题实在让人烦躁。这个家伙上来就问我小明的舅舅是谁,可我连小明是谁都不知道,这人怕不是失了智。好吧,我们换个问题。

什么是计算机程序?

有些人可能会毫不犹豫地说 lambda 算子就是程序,也有些人可能说对计算机硬件的可预先设定的操作就是程序。这两个说法都没有问题,维基百科上给出的解释是这样。

A computer program is a collection of instructions that performs a specific task when executed by a computer. A computer requires programs to function

我们今天可以看看另一种风格的“程序”

prolog

这是一门不同的语言,它没有赋值,也没有传统意义上的函数。它有的只是陈述性语句和待求解的问题。这是个例子:

这并不像是程序而像一份声明清单,而 prolog 恰恰是以一阶谓词为基础的逻辑性语言(program in logic)(个人认为,这某种程度上也限制了它的应用场景)prolog 求解问题的方是还是十分暴力的,主要是匹配和回溯。
例如上述问题,prolog 是如何处理的呢?其步骤如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1.找到第一个问题 uncle(a,U)
2.进行事实匹配
father(a,b).
father(c,d).
father(a,c).
均不符合。
3.规则匹配有
brother(a,Z),father(Z,U)
4.再分为两个问题
brother(a,Z)与 father(Z,U)
进行匹配
5.brother(a,Z)
可以匹配到
brother(a,c).
故有:{c/Z} (注:类似于变量替换)
6.代入进第二个问题
father(c,U)
7.寻找事实
father(c,d)符合
可得{d/U} 8.解为 d 即 a 是 d 的叔叔

可以看出 prolog 处理问题比较死板,其逻辑又相似于 sql 之类的数据库语言(事实上其变种语言的确应用在了数据库上)然而其程序编写的难度对新手的确极不友好但学习这种这种语言也给我们提供了另一种看待程序语言的思路(或者说看待程序的思路)
这篇博客只是简要介绍了 prolog 的基本思路,prolog 中还有很多其他技巧,如果感兴趣可以慢慢探索。