:- initialization(main).
main :- write('Hello, World!').
%BUBBLE SORT START%
% Predicate to swap the first two elements of the list if they are in descending order
swap([X, Y|T], [Y, X | T]):-
Y =< X. % Check if Y is less than or equal to X, indicating a swap is needed
% Recursive predicate to swap elements in the tail of the list
swap([H|T], [H|T1]):-
swap(T, T1). % Recursively swap elements in the tail
% Bubble sort algorithm starts here.
% Predicate for bubble sort algorithm.
% bubbleSort/2 sorts a given list using the bubble sort algorithm.
% It repeatedly calls swap/2 predicate to perform swaps until the list is sorted.
% The cut operator (!) is used to ensure that only one swap is performed in each iteration.
bubbleSort(L, SL):-
swap(L, L1), % Call swap/2 predicate to swap elements in the list
!, % Cut operator to prevent backtracking and ensure only one swap is performed
bubbleSort(L1, SL). % Recursively call bubbleSort with the updated list
% Base case: when no more swaps are needed, return the sorted list
bubbleSort(L, L). % Bubble sort algorithm ends here.
%BUBBLE SORT END%
%INSERTION SORT START%
% Predicate to check if a list is ordered
ordered([]).
ordered([_X]).
ordered([H1, H2|T]):-
H1 =< H2,
ordered([H2|T]).
% Predicate to insert an element into a sorted list
insert(X, [], [X]). % Base case: if the list is empty, X is the only element, forming a new list.
insert(E, [H|T], [E,H|T]):- % Insert E before H if the list is ordered and E is less than or equal to H.
ordered(T),
E =< H,
!.
insert(E, [H|T], [H|T1]):- % Recursively insert E into the sorted tail of the list.
ordered(T),
insert(E, T, T1).
% insertionSort/2 sorts a given list using insertion sort algorithm.
insertionSort([], []). % Base case: an empty list is already sorted.
insertionSort([H|T], SORTED) :-
insertionSort(T, T1), % Recursively sort the tail of the list.
insert(H, T1, SORTED). % Insert the head element into the sorted tail to get the final sorted list.
%INSERTION SORT END%
%MERGE SORT BEGINS%
% mergeSort/2 sorts a given list using the merge sort algorithm.
mergeSort([], []). % Base case: The empty list is already sorted
mergeSort([X], [X]):-!. % Base case: A single-element list is already sorted
% split_in_half/3 splits a list into two halves.
intDiv(N, N1, R):- R is div(N, N1).
split_in_half([], [], []):-!, fail. % Base case: An empty list cannot be split
split_in_half([X], [X], []). % Base case: A single-element list is split into itself and an empty list
split_in_half(L, L1, L2):-
length(L, N),
intDiv(N, 2, N1),
length(L1, N1),
append(L1, L2, L). % Append the first N1 elements to L1 and the rest to L2
% merge/3 merges two sorted lists into a single sorted list.
merge([], L, L). % Base case: If the first list is empty, the merged list is the second list
merge(L, [], L). % Base case: If the second list is empty, the merged list is the first list
merge([H1|T1], [H2|T2], [H1|T]):-
H1 < H2,
merge(T1, [H2|T2], T). % If H1 is smaller, merge the remaining elements of the first list
merge([H1|T1], [H2|T2], [H2|T]):-
H2 =< H1,
merge([H1|T1], T2, T). % If H2 is smaller or equal, merge the remaining elements of the second list
%MERGE SORT ENDS%
%QUICK SORT BEGINS%
% Predicate to split a list into elements smaller or equal to X (SMALL) and elements greater than X (BIG)
split(_, [], [], []). % Base case: an empty list results in empty SMALL and BIG lists
split(X, [H|T], [H|SMALL], BIG):- % If H is smaller or equal to X, add it to SMALL and recurse with the rest of the list
H =< X,
split(X, T, SMALL, BIG).
split(X, [H|T], SMALL, [H|BIG]):- % If H is greater than X, add it to BIG and recurse with the rest of the list
X =< H,
split(X, T, SMALL, BIG).
/* Comment describing quickSort */
% Predicate to perform quicksort on a list
% quickSort(List, SortedList)
quickSort([], []). % Base case: an empty list is already sorted
quickSort([H|T], LS):- % Sort the list by partitioning it into SMALL and BIG, then recursively sorting and concatenating the results
split(H, T, SMALL, BIG),
quickSort(SMALL, S),
quickSort(BIG, B),
append(S, [H|B], LS).
%QUICK SORT ENDS%
%HYBRID SORT STARTS%
% Predicate to perform hybrid sort on a list based on the specified sorting algorithms and threshold
hybridSort(LIST, SMALL, _, THRESHOLD, SLIST):-
length(LIST, N),
N =< THRESHOLD, % If the list length is less than or equal to the threshold, use the specified SMALL sorting algorithm
call(SMALL, LIST, SLIST).
% Hybrid sort using merge sort with a threshold for switching to insertion sort
hybridSort(LIST, SMALL, mergeSort, THRESHOLD, SLIST):-
length(LIST, N),
N > THRESHOLD, % If the list length is greater than the threshold, use merge sort
split_in_half(LIST, L1, L2),
hybridSort(L1, SMALL, mergeSort, THRESHOLD, S1),
hybridSort(L2, SMALL, mergeSort, THRESHOLD, S2),
merge(S1, S2, SLIST).
% Hybrid sort using quicksort with a threshold for switching to insertion sort
hybridSort([H|T], SMALL, quickSort, THRESHOLD, SLIST):-
length([H|T], N),
N > THRESHOLD, % If the list length is greater than the threshold, use quicksort
split(H, T, L1, L2),
hybridSort(L1, SMALL, quickSort, THRESHOLD, S1),
hybridSort(L2, SMALL, quickSort, THRESHOLD, S2),
append(S1, [H|S2], SLIST).
% Hybrid sort using quicksort with a threshold for switching to insertion sort (for single-element list)
hybridSort([H|T], SMALL, quickSort, THRESHOLD, SLIST):-
length([H|T], N),
N =< THRESHOLD, % If the list length is less than or equal to the threshold, use the specified SMALL sorting algorithm
call(SMALL, [H|T], SLIST).
%HYBRID SORT ENDS%
:- dynamic randomList/1.
:- discontiguous measure_time/1.
randomList(N, LIST) :-
randomListHelper(N, [], LIST).
randomListHelper(0, Acc, Acc) :- !.
randomListHelper(N, Acc, LIST) :-
random(1, 100, RandomNumber),
N1 is N - 1,
randomListHelper(N1, [RandomNumber|Acc], LIST).
saveRandomList(N) :-
randomList(N, RandomList),
assertz(RandomList).
measure_time(Goal) :-
statistics(walltime, [Start,_]),
call(Goal),
statistics(walltime, [End,_]),
Time is End - Start,
format('Execution time: ~3f seconds.~n', [Time]). Write, Run & Share Prolog code online using OneCompiler’s Prolog online compiler for free. It’s a simple and intuitive platform to experiment with logic programming in Prolog. OneCompiler supports standard Prolog syntax, great for learning, prototyping, and practicing logic-based problems.
Prolog (Programming in Logic) is a logic programming language associated with artificial intelligence and computational linguistics. It works through facts, rules, and queries, using a form of symbolic reasoning known as backward chaining. Prolog is declarative, meaning you describe what you want instead of how to compute it.
The following is a simple Prolog program that prints a greeting:
:- initialization(main).
main :-
write('Hello, World!').
Facts represent basic assertions about the world.
likes(alice, pizza).
likes(bob, pasta).
Rules define logical relationships using facts.
friends(X, Y) :- likes(X, Z), likes(Y, Z).
Queries are used to find information based on facts and rules.
?- likes(alice, What).
| Operator | Description |
|---|---|
:- | Rule definition |
, | Logical AND |
; | Logical OR |
= | Unification |
member(X, [X|_]).
member(X, [_|T]) :- member(X, T).
Prolog heavily relies on recursion.
factorial(0, 1).
factorial(N, F) :-
N > 0,
N1 is N - 1,
factorial(N1, F1),
F is N * F1.
This guide provides a quick reference to Prolog programming syntax and features. Start writing Prolog code using OneCompiler’s Prolog online compiler today!