INTERACTIVE PROLOG GUIDE © Roman Barták 1997
I NTRODUCTORY
S AMPLES
I try to collect some introductory PROLOG programs that can help you to
understand underlying principles of PROLOG programming. Send me other
examples or ideas of short programs to publish them in this page.
Currently, I am working on a new subsite Learning
Prolog via Examples which will contain much more examples of PROLOG code. As
soon as this subsite infills by more examples I expect to remove this page.
Tip: Use Copy&Paste function of the browser to move the code into
the PROLOG environment.
member/2
test membership relation (member(3,[1,2,3])->true)
also generates members of given list
usage: ?-member(X,[1,2,3]).
member(X,[X|T]).
member(X,[_|T]):-
member(X,T).
append/3
appends two lists ([1,2,3],[4,5]->[1,2,3,4,5])
usage: ?-append([1,2,3],[4,5],X).
try also ?-append(A,B,[1,2,3,4,5]).
append([H|T],L2,[H|R]):-
append(T,L2,R2).
append([],R,R).
revert/2
list reversion ([1,2,3]->[3,2,1])
usage: ?-revert([1,2,3],R).
revert(List,RevList):-
rev(List,[],RevList).
rev([H|T],S,R):-
rev(T,[H|S],R).
rev([],R,R).
perm/2
permutation generator
([1,2,3]->[1,2,3];[2,1,3];[2,3,1],[1,3,2],[3,1,2],[3,2,1])
usage: ?-perm([1,2,3],P).
perm([H|T],Perm):-
perm(T,SP),insert(H,SP,Perm).
perm([],[]).
insert(X,T,[X|T]).
insert(X,[H|T],[H|NT]):-
insert(X,T,NT).
solve/1
PROLOG interpreter written in PROLOG (so-called vanilla meta-interpreter)
usage: ?-solve(PrologGoal).
solve(true).
solve((A,B)):-
solve(A),
solve(B).
solve(A):-
clause(A,B),
solve(B).
turing/3
emulator of Turing machine (more information can be found here -only
in Czech)
usage:
?-turing(InitialState,LeftPartOfTape-RightPartOfTape,ResultTape).
turing(State,[Letter|Left]-Right,FinalTape):-
c(State,Letter,NewState,Write,Move),
move(Move,[Write|Left]-Right,NewTape),
turing(NewState,NewTape,FinalTape).
turing(State,Tape,Tape):-
f(State).
move(none,Tape,Tape).
move(left,[X|Left]-Right,NewLeft-NewRight):-
(Left=[] -> NewLeft=[free] ; NewLeft=Left),
(Right=[free] -> NewRight=[X] ; NewRight=[X|Right]).
move(right,Left-[X|Right],NewLeft-Right):-
Left=[free] -> NewLeft=[X] ; NewLeft=[X|Left].
move(right,Left-[],NewLeft-[]):-
Left=[free] -> NewLeft=Left ; NewLeft=[free|Left].
Last update 6 th October 1997 Designed and maintained by
Roman Bartak ©
October 1997