算数运算
- 最美公式长廊
- 5.1 Arithmetic in Prolog
- 实战一
- 验证
- 括号不能乱加
- 验证
- |回头
- 变量也可以表示列表
- 再叙递归
- 重点
最美公式长廊
里面有些数学公式,大都做了图形化展示。算数无处不在,当然缺不了逻辑编程。
![]() |
---|
5.1 Arithmetic in Prolog
可以进行基本的整数运算。主要是用整数表示前面讲的表的长度。
实战一
参照列表求最大值,实现求列表最小值。
addone([],[]).
addone([X|XT],[Y|YT]):-
Y is X + 1,addone(XT,YT).
accMax([H|T],A,Max) :-
H > A,
accMax(T,H,Max).
accMax([H|T],A,Max) :-
H =< A,
accMax(T,A,Max).
accMax([],A,A).
max(List,Max) :-
List = [H|_],
accMax(List,H,Max).
accMin([H|T],A,Max) :-
H < A,
accMin(T,H,Max).
accMin([H|T],A,Max) :-
H >= A,
accMin(T,A,Max).
accMin([],A,A).
min(List,Min) :-
List = [H|_],
accMin(List,H,Min).
改一下大小符号,单词Max改成Min就可以了。
验证
min([-11,-2,-7,-4,-12],X).
X
-12 1
false
括号不能乱加
第二题列表里各项同时都乘以一个数。
scalarMult(_,[],[]).
scalarMult(Z,[X|TX],[Y|TY]):-
Y is X*Z,scalarMult(Z,TX,TY).%多加了括号不行
验证
scalarMult(3,[2,7,4],Result).
Result
[6, 21, 12] 1
false
Y is XZ,scalarMult(Z,TX,TY).开始写成了Y is XZ,scalarMult(Z,[TX],[TY])。想到TX,TY也是列表,列表就应该加中括号。这是错误的想法。我在前面逻辑的空无里还认为它是列表分头尾后后面的元组项。
|回头
member(X,[1|2,3,4]).试一下这种写法,直接报错了。
Syntax error: Unexpected comma or bar in rest of list (in_http_request)
前面列表的练习里正好有这样的例子。
改成这样就可以了。
member(X,[1|[2,3,4]]).
X
1 1
2 2
3 3
4
变量也可以表示列表
也只能跟自己这样解释了,看前面抄的第一题求最小值人家也是这样写的。
再叙递归
求列表各项相乘的总和。
第三行第四行不能写反了。
dot([],[],0).
dot([X|TX],[Y|TY],Result):-
dot(TX,TY,T),
Result is(XY + T).
验证回答是32.
看调试里T跟Result是不一样的内存了。一般程序开发语言都是一个变量写到底。这也许才是递归应该的写法。
/
Call:dot([2, 5, 6],[3, 4, 1],_5406)
Call:dot([5, 6],[4, 1],_1196)
Call:dot([6],[1],_1198)
Call:dot([],[],_1200)
Exit:dot([],[],0)
Call:_1192 is 61+0
Exit:6 is 61+0
Exit:dot([6],[1],6)
Call:_1190 is 54+6
Exit:26 is 54+6
Exit:dot([5, 6],[4, 1],26)
Call:_978 is 23+26
Exit:32 is 23+26
Exit:dot([2, 5, 6],[3, 4, 1],32)
*/
重点
失业了,求职中!能有口饭吃将不胜感激。