Prolog Cookbook
factorial(0, 1). factorial(N, N_Fact) :- N > 0, M is N-1, factorial(M, M_Fact), N_Fact is M_Fact*N.;; Non tail recursive version - is going to stack overflow quickly fib(0, 0). fib(1, 1). fib(N, N_Fib) :- N > 1, M is N-1, T is N-2, fib(M, M_Fib), fib(T, T_Fib), N_Fib is M_Fib + T_Fib. ;; Tail recursive version fibonacci(N, N_Fib) :- tfib(N, 0, 1, N_Fib). tfib(0, A, _, A). tfib(N, A, B, N_Fib) :- N > 0, Next_N is N-1, Next_A is B, Next_B is A + B, tfib(Next_N, Next_A, Next_B, N_Fib).likes(jimmy, anna). likes(paul, anna). likes(jimmy, paul). popular(X) :- aggregate(count, Y^likes(Y,X), N), N > 1.double(X, Y) :- Y is X + X. pow2(X, Y) :- Y is X * X. map([], _, []). map([X|Xs], P, [Y|Ys]) :- call(P, X, Y), map(Xs, P, Ys). ;; Examples map([1, 2, 3], double, Xs). ;; Xs = [1, 4, 6] map([1, -2, 3], pow2, Xs). ;; Xs = [1, 4, 9]current_predicate(map/3). ;; checks whether map which takes 3 parameters existsappend([], Ys, Ys). append([X|Xs], Ys, [X|Zs]) :- append(Xs, Ys, Zs). prefix(P, L) :- append(P, _, L). suffix(S, L) :- append(_, S, L). contains(SubL, L) :- suffix(S, L), prefix(SubL, S), !.palindrome(Xs) :- reverse(Xs, Xs).member(X, [1, 2, 3]), member(Y, [10, 11, 12]), member(Z, [1, 2]), palindrome([X, Y, Z]).
Last updated