serious stuff
www.cubbi.com
personal
programming
fibonacci numbers
algorithms
benchmarks
forth examples
postscript examples
muf examples
joy examples
j examples
scheme examples
hope examples
ocaml examples
haskell examples
prolog examples
c++ examples
java examples
assembly language examples
fortran examples
c examples
sh examples
awk examples
perl examples
tcl examples
asmix
hacker test
resume
science
martial arts
fun stuff
www.cubbi.org
|
Prolog
Date: 1971 (Standardized in ISO/IEC 13211-1:1995)
Type: Logic programming language
Usage: artificial intellect, fuzzy logic, natural language processing, etc. It's a research language.
ALGORITHM 1A: NAIVE BINARY RECURSION |
fib(0,0).
fib(1,1).
fib(N,F) :-
succ(N1,N), succ(N2,N1), fib(N1,F1), fib(N2,F2), plus(F1,F2,F).
f(N,F) :-
AN is abs(N), fib(AN,FP), F is FP * (sign(N) ** (N+1)).
fib_print(N) :-
write(N), write('th Fibonacci number is '), f(N,X), write(X), nl.
main :-
current_prolog_flag(argv,A), length(A, AL),
AL =:= 5, last(A, M), catch(atom_number(M,N),_,fail), fib_print(N) ;
write('Usage: f1a <n>\n').
|
ALGORITHM 1B: CACHED BINARY RECURSION |
:- dynamic tabled_fib/2.
fib(N,F) :- tabled_fib(N,F), !.
fib(N,F) :- work_fib(N,F), assert(tabled_fib(N,F)).
work_fib(0,0).
work_fib(1,1).
work_fib(N,F) :- succ(N1,N), succ(N2,N1), fib(N1,F1), fib(N2,F2), plus(F1,F2,F).
f(N,F) :-
AN is abs(N), fib(AN,FP), F is FP * (sign(N) ** (N+1)).
fib_print(N) :-
write(N), write('th Fibonacci number is '), f(N,X), write(X), nl.
main :-
current_prolog_flag(argv,A), length(A, AL),
AL =:= 5, last(A, M), catch(atom_number(M,N),_,fail), fib_print(N) ;
write('Usage: f1b <n>\n').
|
ALGORITHM 2A: CACHED LINEAR RECURSION |
f(N,F) :-
AN is abs(N), fiblist(AN,[FP|_]), F is FP* sign(N) ** (N+1).
fiblist(0, [0]).
fiblist(1, [1,0]).
fiblist(N, [F2,F1,F0|L]) :- succ(NP,N), fiblist(NP, [F1,F0|L]), plus(F0,F1,F2).
fib_print(N) :-
write(N), write('th Fibonacci number is '), f(N,X), write(X), nl.
main :-
current_prolog_flag(argv,A), length(A, AL),
AL =:= 5, last(A, M), catch(atom_number(M,N),_,fail), fib_print(N) ;
write('Usage: f2a <n>\n').
|
ALGORITHM 2B: LINEAR RECURSION WITH ACCUMULATOR |
f(N,F) :-
AN is abs(N), l(0,1,AN,FP), F is FP* sign(N) ** (N+1).
l(F1,F2,N,F):-
N < 1, F is F1;
plus(F1,F2,F3), succ(N2,N), l(F3,F1,N2,F).
fib_print(N) :-
write(N), write('th Fibonacci number is '), f(N,X), write(X), nl.
main :-
current_prolog_flag(argv,A), length(A, AL),
AL =:= 5, last(A, M), catch(atom_number(M,N),_,fail), fib_print(N) ;
write('Usage: f2b <n>\n').
|
ALGORITHM 2C: IMPERATIVE LOOP WITH MUTABLE VARIABLES |
f(N,F) :-
nb_setval(x1, 0), nb_setval(x2, 1),
AN is abs(N), fibloop(AN,FP), F is FP* sign(N) ** (N+1).
fibloop(N,F) :-
N < 1, nb_getval(x1,F);
nb_getval(x1,A), nb_getval(x2,B), plus(A,B,SUM),
nb_setval(x1,SUM), nb_setval(x2,A), succ(NP,N), fibloop(NP,F).
fib_print(N) :-
write(N), write('th Fibonacci number is '), f(N,X), write(X), nl.
main :-
current_prolog_flag(argv,A), length(A, AL),
AL =:= 5, last(A, M), catch(atom_number(M,N),_,fail), fib_print(N) ;
write('Usage: f2c <n>\n').
|
ALGORITHM 3A: MATRIX MULTIPLICATION |
:- use_module(library(clpfd)).
dot(V1, V2, N) :- maplist(product,V1,V2,P), sumlist(P,N).
product(N1,N2,N3) :- N3 is N1*N2.
mmult(M1, M2, M3) :- transpose(M2,MT), maplist(mm_helper(MT), M1, M3).
mm_helper(M2, I1, M3) :- maplist(dot(I1), M2, M3).
mp(N,M,M) :- N < 2.
mp(N,M,R) :- T2 is N mod 2, T is N//2, mp(T,M,C),
( T2 =:= 0, mmult(C,C,R); mmult(C,C,C2), mmult(C2,M,R) ), !.
fib(N, F) :-
N < 1, F = 0;
succ(NP,N), mp(NP, [[1,1],[1,0]], [[F,_],_]).
f(N,F) :-
AN is abs(N), fib(AN,FP), F is FP* sign(N) ** (N+1).
fib_print(N) :-
write(N), write('th Fibonacci number is '), f(N,X), write(X), nl.
main :-
current_prolog_flag(argv,A), length(A, AL),
AL =:= 5, last(A, M), catch(atom_number(M,N),_,fail), fib_print(N) ;
write('Usage: f3a <n>\n').
|
ALGORITHM 3B: FAST RECURSION |
fib(0, [0,0]).
fib(1, [1,0]).
fib(N, [F1,F2]) :-
T2 is N mod 2, T is N // 2, fib(T, [K2, K1]), plus(K1,K2,K3),
(T2 =:= 0, F1 is (K1+K3)*K2, F2 is K1^2+K2^2;
F1 is K3^2+K2^2, F2 is (K1+K3)*K2 ), !.
f(N,F) :-
AN is abs(N), fib(AN,[FP,_]), F is FP* sign(N) ** (N+1).
l(F1,F2,N,F):-
N < 1, F is F1;
plus(F1,F2,F3), succ(N2,N), l(F3,F1,N2,F).
fib_print(N) :-
write(N), write('th Fibonacci number is '), f(N,X), write(X), nl.
main :-
current_prolog_flag(argv,A), length(A, AL),
AL =:= 5, last(A, M), catch(atom_number(M,N),_,fail), fib_print(N) ;
write('Usage: f3b <n>\n').
|
ALGORITHM 3C: BINET'S FORMULA WITH ROUNDING |
fib(N, F) :-
Phi is (1+5**0.5)/2,
F is round(Phi**N/(5**0.5)).
f(N,F) :-
AN is abs(N), fib(AN,FP), F is FP* sign(N) ** (N+1).
fib_print(N) :-
write(N), write('th Fibonacci number is '), f(N,X), write(X), nl.
main :-
current_prolog_flag(argv,A), length(A, AL),
AL =:= 5, last(A, M), catch(atom_number(M,N),_,fail), fib_print(N) ;
write('Usage: f3c <n>\n').
|
|