转载自:https://mp.weixin.qq.com/s/1my79TnLOc0p0BWoSYlc7A
1 Prolog中的算术
?- 8 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.
?- [user].
|: add_3_and_double(X,Y):- Y is (X+3)*2.
|: ^D% user://11 compiled 0.00 sec, 1 clauses
true.
?- add_3_and_double(1,X).
X = 8.
?- add_3_and_double(2,X).
X = 10.
?- X is 3+2*4.
X = 11.
?- X = 2+3.
X = 2+3.
?- 3+2*5 = X.
X = 3+2*5.
?- X = 3+2*5.
X = 3+2*5.
?- X is 6+2.
X = 8.
?- 6+2 is X.
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [10] 6+2 is _7854
ERROR: [9] <user>
?- listing(add_3_and_double).
add_3_and_double(B, A) :-
A is (B+3)*2.
true.
?- add_3_and_double(X,12).
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [11] 12 is (_10588+3)*2
ERROR: [9] <user>
ERROR:
ERROR: Note: some frames are missing due to last-call optimization.
ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
?-
?- X is +(3,2).
X = 5.
?- is(X,+(3,2)).
X = 5.
算术和表
?- [user].
|: len([], 0).
|: len([_|T],N):- len(T,X), N is X+1.
|: ^D% user://12 compiled 0.00 sec, 2 clauses
true.
?- len([a,b,c,d,e,[a,b],g],X).
X = 7.
?- [user].
|: accLen([_|T],A,L):- Anew is A+1,accLen(T,Anew,L).
|: accLen([],A,A).
|: ^D% user://13 compiled 0.00 sec, 2 clauses
true.
?- trace.
true.
[trace] ?- accLen([a,b,c],0,L).
Call: (10) accLen([a, b, c], 0, _6462) ? creep
Call: (11) _6746 is 0+1 ? creep
Exit: (11) 1 is 0+1 ? creep
Call: (11) accLen([b, c], 1, _6462) ? creep
Call: (12) _6752 is 1+1 ? creep
Exit: (12) 2 is 1+1 ? creep
Call: (12) accLen([c], 2, _6462) ? creep
Call: (13) _6758 is 2+1 ? creep
Exit: (13) 3 is 2+1 ? creep
Call: (13) accLen([], 3, _6462) ? creep
Exit: (13) accLen([], 3, 3) ? creep
Exit: (12) accLen([c], 2, 3) ? creep
Exit: (11) accLen([b, c], 1, 3) ? creep
Exit: (10) accLen([a, b, c], 0, 3) ? creep
L = 3.
[trace] ?- notrace.
true.
[debug] ?- nodebug.
true.
?- [user].
|: leng(List,Length):- accLen(List,0,Length).
|: ^D% user://1 compiled 0.00 sec, 5 clauses
true.
?- trace.
true.
[trace] ?-
| leng([a,b,c],L).
Call: (10) leng([a, b, c], _11568) ? creep
Call: (11) accLen([a, b, c], 0, _11568) ? creep
Call: (12) _11832 is 0+1 ? creep
Exit: (12) 1 is 0+1 ? creep
Call: (12) accLen([b, c], 1, _11568) ? creep
Call: (13) _11838 is 1+1 ? creep
Exit: (13) 2 is 1+1 ? creep
Call: (13) accLen([c], 2, _11568) ? creep
Call: (14) _11844 is 2+1 ? creep
Exit: (14) 3 is 2+1 ? creep
Call: (14) accLen([], 3, _11568) ? creep
Exit: (14) accLen([], 3, 3) ? creep
Exit: (13) accLen([c], 2, 3) ? creep
Exit: (12) accLen([b, c], 1, 3) ? creep
Exit: (11) accLen([a, b, c], 0, 3) ? creep
Exit: (10) leng([a, b, c], 3) ? creep
L = 3.
[trace] ?- len([a,b,c],X).
Call: (10) len([a, b, c], _12088) ? creep
Call: (11) len([b, c], _12346) ? creep
Call: (12) len([c], _12346) ? creep
Call: (13) len([], _12346) ? creep
Exit: (13) len([], 0) ? creep
Call: (13) _12350 is 0+1 ? creep
Exit: (13) 1 is 0+1 ? creep
Exit: (12) len([c], 1) ? creep
Call: (12) _12356 is 1+1 ? creep
Exit: (12) 2 is 1+1 ? creep
Exit: (11) len([b, c], 2) ? creep
Call: (11) _12088 is 2+1 ? creep
Exit: (11) 3 is 2+1 ? creep
Exit: (10) len([a, b, c], 3) ? creep
X = 3.
[trace] ?- notrace.
true.
[debug] ?- nodebug.
true.
比较整数
?- 2<4.
true.
?- 2=<4.
true.
?- 4=<4.
true.
?- 4=:=4.
true.
?- 4=\=5.
true.
?- 4>=4.
true.
?- 4>2.
true.
?- 2 < 4+1.
true.
?- 5 < 4+2.
true.
?- 2+1<4.
true.
?- 2+1 < 3+2.
true.
?- 2+2=4.
false.
?- 2+2=:=4.
true.
?- X<3.
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [10] _12810<3
ERROR: [9] <user>
?- 3<Y.
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [10] 3<_13802
ERROR: [9] <user>
?- X=:=X.
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [10] _14804=:=_14806
ERROR: [9] <user>
?- X=3,X<4.
X = 3.
?- X=b, X<4.
ERROR: Arithmetic: `b/0' is not a function
ERROR: In:
ERROR: [11] b<4
ERROR: [9] <user>
ERROR:
ERROR: Note: some frames are missing due to last-call optimization.
ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
//需要多解时键入’;’ 否则键入’.’
?- accMax([1,0,5,4],0,Max).
Max = 5 ;
false.
?- accMax([0,5,4],1,Max).
Max = 5 ;
false.
?- accMax([1,0,5,4],0,Max).
Max = 5 .
?- accMax([0,5,4],1,Max).
Max = 5 .
?- accMax([-11,-2,-7,-4,-12],0,Max).
Max = 0.
?- [user].
|: max(List,Max):-
|: List=[H|_],
|: accMax(List,H,Max).
|: ^D% user://3 compiled 0.00 sec, 1 clauses
true.
?- max([-11,-2,-7,-4,-12],Max).
Max = -2 .
?- max([1,2,46,53,0],X).
X = 53 .
练习
?- [user].
|: increment(X,Y):-Y is X + 1.
|: sum(X,Y,Z):-Z is X + Y.
|: ^D% user://4 compiled 0.00 sec, 2 clauses
true.
?- increment(9,10).
true.
?- increment(9,X).
X = 10.
?- sum(45,98,X).
X = 143.
?- sum(45,98,99).
false.
?- sum(45,98,143).
true.
?- [user].
|: addone([],[]).
|: addone([H|T],[H1|T1]):- H1 is H+1,addone(T,T1).
|: ^D% user://5 compiled 0.00 sec, 2 clauses
true.
?- addone([1,2,3,4,5,6],X).
X = [2, 3, 4, 5, 6, 7].
?- [user].
|: accMin([A|C], B, D):-
|: A<B,
|: accMin(C,A,D).
|: accMin([A|C],B,D):-
|: A>=B,
|: accMin(C,B,D).
|: accMin([],A,A).
|: ^D% user://6 compiled 0.00 sec, 3 clauses
true.
?- accMin([-11,-2,-7,-4,-12],0,Max).
Max = -12 .
?- [user].
|: scalarMult(_,[],[]).
|: scalarMult(A,[H|T],[H1|T1]):- H1 is A*H, scalarMult(A,T,T1).
|: ^D% user://7 compiled 0.00 sec, 2 clauses
true.
?- scalarMult(3,[2,7,4],Result).
Result = [6, 21, 12] .
?- [user].
|: dot([],[],0).
|: dot([H1|T1],[H2|T2],Result):-
|: dot(T1,T2,Result1),
|: Result is H1*H2 + Result1.
|: ^D% user://1 compiled 0.00 sec, 2 clauses
true.
?- dot([2,5,6],[3,4,1],Result).
Result = 32.