转载自:https://mp.weixin.qq.com/s/WvQcyFSb4qb5SnHr0O3sKg
1 Prolog中的算术
Prolog提供了许多用于处理整数的基本算术工具(即,形式为...- 3,-2,-1、0、1、2、3、4 ...的数字)。大多数Prolog实施还提供了处理诸如1.53或6.35×105之类的实数(或浮点数)的工具,但我们将不讨论这些工具,因为它们对于本书中讨论的符号处理任务不是特别有用。另一方面,整数在符号任务中很有用(例如,我们使用它们来说明表的长度),因此了解如何使用它们很重要。我们将首先了解Prolog如何处理加,乘,减, 和除。
算术示例 Prolog表示法
6 + 2 = 8 8 is 6+2.
6 ∗ 2 = 12 12 is 6*2.
6 − 2 = 4 4 is 6-2.
6 − 8 = −2 -2 is 6-8.
6 ÷ 2 = 3 3 is 6/2.
7 ÷ 2 = 3 3 is 7/2.
1 is the remainder when 7 is divided by 2 1 is mod(7,2).
请注意,在处理整数时,除法会返回整数答案。因此7÷2给出3作为答案,余数为1。
键入以下查询将产生相应响应:
?- 8 is 6+2.
true
?- 12 is 6*2.
true
?- -2 is 6-8.
true
?- 3 is 6/2.
true
?- 1 is mod(7,2).
true
更重要的是,我们可以通过使用变量来得出算术问题的答案。例如:
?- X is 6+2.
X = 8
?- X is 6*2.
X = 12
?- R is mod(7,2).
R = 1
此外,定义谓词时可以使用算术运算。这是一个简单的示例。让我们定义一个谓词add_3_and_double / 2,其参数均为整数。该谓词采用其第一个参数,向其添加三个,将结果加倍,并返回获得的数字作为第二个参数。我们将该谓词定义如下:
add_3_and_double(X,Y):- Y is (X+3)*2.
确实,这可行:
?- add_3_and_double(1,X).
X = 8
?- add_3_and_double(2,X).
X = 10
另一件事。 Prolog了解我们用于消除算术表达式歧义的常用约定。例如,当我们写 3+2×4时,是指3+(2×4)而不是(3+2)×4,而Prolog知道以下约定:
?- X is 3+2*4.
X = 11
2 近距离观察
这是基础知识,但我们需要了解更多。最重要的要领是:+,*,-,÷和mod不执行任何算术运算。实际上,诸如3 + 2、3-2和3 * 2之类的表达式只是简单的项。这些项的函子分别为+,-和*,参数分别为3和2。除了函子介于其自变量之间(而不是在它们前面)以外,它们都是普通的Prolog项,除非我们做一些特别的事情,Prolog实际上不会做任何算术运算。特别是如果我们提出查询
?- X = 3+2.
我们没有得到答案X = 5。相反,响应我们的是合一项
X = 3+2.
也就是说,Prolog仅将变量X合一为复合项3+2。它没有执行任何算术运算。它已经简单地完成了使用= / 2时通常的工作:执行合一。
同样,如果我们构成查询
?- 3+2*5 = X.
响应我们的是合一项
X = 3+2*5.
<