Đệ quy là kỹ thuật lập trình được sử dụng trong nhiều ngôn ngữ. Trong Turbo Prolog ta sử dụng đệ quy khi một vị từ được định nghĩa nhờ vào chính vị từ đó.
Như đã nói trong chương lập trình hàm, trong chương trình đệ quy phải có ít nhất một trường hợp dừng và lời gọi đệ quy phải chứa yếu tố dẫn đến trường hợp dừng. Trong Prolog, trường hợp dừng được thể hiện bằng một sự kiện, yếu tố dẫn đến trường hợp dừng thể hiện bằng một biến, liên hệ với biến ban đầu bởi một công thức.
Ví dụ 1: Tính n giai thừa.
Predicates
Facto (integer, integer)
Clauses
Facto(0,1):- !.
Facto(N, FactN) :- N > 0, M = N – 1, facto(M, factM), factN = N*factM.
Ở ví dụ trên ta đã định nghĩa một vị từ dùng để tính giá trị giai thừa của một số tự nhiên, đối số thứ nhất là số cần tính giai thừa và đối số thứ hai dùng để nhận giá trị trả về.
Trường hợp dừng ở đây được xác đinh bởi sự kiện 0 giai thừa là 1.
Để tính N! ta tính M! với M= N-1. Yếu tố dẫn đến trường hợp dừng là biến M có giá trị bằng N-1.
Ví dụ 2: Xác định một phần tử trong danh sách các symbol
domains
symbol_list = symbol*
predicates
element1(integer,symbol_list,symbol)
element (integer,symbol_list,symbol)
clauses
% element1 không suy diễn ngược được
element1(1,[X|_],X).
element1(N,[_|L],Y):-M=N-1,
element1(M,L,Y).
% element có thể suy diễn ngược
element(1,[X|_],X).
element(N,[_|L],Y):-element(M,L,Y),
N=M+1.
Sự suy diễn thuận chiều là cho danh sách và vị trí, tìm được phần tử tại vị trí đó, chẳng hạn, nếu ta đưa vào goal element(2,[a,b,c,d],X) ta được X=b.
Sự suy diễn ngược ở đây là cho danh sách và phần tử, tìm được vị trí của phần tử đó, chẳng hạn, nếu ta đưa vào goal element(N,[a,b,c,d], b) ta được N=2.
Ví dụ 3: Sắp xếp một danh sách các số nguyên
domains
list=integer*
predicates
insert(integer,list,list)
sort(list,list)
clauses
insert(E,[],[E]).
insert(E,[A|B],[E,A|B]):-E<=A.
insert(E,[A|B],[A|C]):-E>A,insert(E,B,C).
sort([],[]).
sort([X|R1],L):-sort(R1,R),
insert(X,R,L).