sandbox/lpn/ch05/notes.md

1.1 KiB

Chapter 5: Arithmetic in Prolog

Prolog provides basic arithmetic operators.

Ex.

  ?-  8  is  6+2.
   yes
   
   ?-  12  is  6*2.
   yes
   
   ?-  -2  is  6-8.
   yes
   
   ?-  3  is  6/2.
   yes
   
   ?-  1  is  mod(7,2).
   yes 

   ?- X is 12/4.
   X = 3.

The operators don't actually do arithmetic:

?- X = 2 + 3.
X = 2+3.

The default is just to do unification; is must be used. The arithmetic expression must be on the RHS. This part of Prolog is a black box that handles this, and isn't part of the normal KB and unification parts.

Arithmetic and lists

A recursive list length calculator:

len([], 0).
len([_|T], N) :-
	len(T, X),
	N is X+1.

A tail-recursive length calculator:

alen_([], A, A).
alen_([_|H], A, L) :-
	A2 is A+1,
	alen_(H, A2, L).
alen(X, L) :- alen_(X, 0, L).

Standard notes about tail recursion efficiency apply here.

Comparing integers

  • x < yX < Y.
  • x ≤ yX =< Y.
  • x = yX =:= Y.
  • x ≠ yX =\= Y.
  • x ≥ yX >= Y
  • x > yX > Y

Note the difference between = and =:=.

Let's write a max function: