
2.1 用自然语言表示
自然语言是人类交流和思维的主要工具,是人类智慧的结晶。自然语言处理是人工智能中最为困难的问题之一,而对自然语言处理的研究也是充满魅力和挑战的。算法可以用自然语言表示,下面来看几个例子。
【实例2.1】 烧绳计时问题。
一根粗细均匀的绳子,点燃一头,完全燃烧完需要1个小时。现有若干条材质相同的绳子,用烧绳的方法实现1小时15分钟的计时。用自然语言来描述这一烧绳计时问题的实现过程。
实现步骤如下:
(1)将一根绳子两头点燃,同时另取一根绳子点燃一头,如图2.1所示。
(2)当第一根绳子燃烧完,即为30分钟,这时将第二根绳子的另一头也点燃,并开始计时,如图2.2所示。

图2.1 一根绳子两头点燃,另一根绳子点燃一头

图2.2 第二根绳子的另一头也点燃
(3)从计时开始,到第二根绳子完全燃烧完,用时15分钟,如图2.3所示。

图2.3 第二根绳子后半段燃烧完用时15分钟
(4)再取一根绳子,从一头点燃,直至燃烧完毕,用时1小时,如图2.4所示。此时计时结束。
从计时开始,到计时结束,加起来用的时间正好是1小时15分钟(见图2.3和图2.4)。上面的步骤(1)(2)(3)(4)就是用自然语言描述的烧绳计时问题。
【实例2.2】 舀酒问题。
一家商店卖酒,店里只有两个舀酒的勺子,分别能舀7两酒和11两酒。有一天,一位顾客为了难为老板,硬要买2两酒。聪明的老板毫不含糊,用两个勺子在酒缸里舀酒,并倒来倒去,居然真的量出了2两酒。聪明的你能做到吗?试着用自然语言描述此问题的解决过程。
实现步骤如下:
(1)先舀7两酒倒入11两的勺里,此时11两勺里有7两酒,如图2.5所示。

图2.4 第三根绳子燃烧完用时1小时

图2.5 舀7两酒倒入11两勺里
(2)再舀7两酒往11两的勺里倒,由于11两勺里只能再倒入4两酒,因此7两勺里将剩下3两酒,如图2.6所示。
(3)把11两勺里的酒倒掉,再把7两勺里的3两酒倒入11两勺里,此时11两勺子里有3两酒,如图2.7所示。
(4)再舀7两酒倒入11两勺里,此时11两勺里还可以装11−(3+7)=1两酒,如图2.8所示。

图2.6 再舀7两酒补满11两勺

图2.7 将剩余3两倒入11两勺里

图2.8 舀7两酒倒入11两勺里
(5)再舀7两酒往11两勺里倒,由于只能倒1两酒,所以7两勺中还剩下7−1=6两酒,如图2.9所示。
(6)把11两勺里的酒倒掉,把7两勺里的6两酒倒入,此时11两勺里还可以再装11−6=5两酒,如图2.10所示。
(7)再舀7两酒,往11两勺里倒,补满之后,7两勺里剩下7−5=2两酒,如图2.11所示。
从最后的描述上看,最终用7两勺和11两勺舀出2两的酒。
这两个实例使用自然语言来描述一个算法。对于自然语言描述算法有优点也有缺点。优点是易于理解,更符合人类的语言描述;缺点是不能让计算机执行,书写较麻烦,对复杂的问题难以表达准确。

图2.9 7两勺里还剩下6两酒

图2.10 将6两酒倒入11两勺里

图2.11 7两勺还剩2两酒