• List Flatten
    flatten([], []).
    flatten([First|Rest], [First|RestFlattened]) :-
    atomic(First),
    flatten(Rest, RestFlattened).
    
    flatten([First|Rest], FlattenedList) :-
    flatten(First, FirstFlattened),
    flatten(Rest, RestFlattened),
    append(FirstFlattened, RestFlattened, FlattenedList).
    
  • Insertion sort
    insertionsort([],[]).
    insertionsort([First|Rest], SortedList) :-
    insertionsort(Rest,NewList),
    insert(First, NewList, SortedList).
    
    insert(Element, [], [Element]).
    insert(Element, [First|Rest], [First|NewList]) :-
    Element > First, insert(Element, Rest, NewList).
    insert(Element, List, [Element|List]).
    
  • Selection Sort
    selectionsort([],[]).
    selectionsort([First|Rest], [Smallest|SortedList]) :-
    smallest(Rest, First, Smallest),
    remove([First|Rest], Smallest, NewList),
    selectionsort(NewList, SortedList).
    
    /* looks for the smallest element in the list
    atom A is the current smallest
    */
    smallest([], Smallest,Smallest).
    smallest([First|Rest], CurrSmallest, Smallest) :-
    First < CurrSmallest, smallest(Rest, First, Smallest).
    smallest([_|Rest], CurrSmallest, Smallest) :-
    smallest(Rest, CurrSmallest, Smallest).
    
    /* remove the first occurance of atom A from L */
    remove([], _, []).
    remove([First|Rest], First, Rest).
    remove([First|Rest], Element, [First|NewList]) :-
    remove(Rest, Element, NewList).
    
  • Merge Sort
    mergesort([],[]).
    mergesort([OneElement], [OneElement]).
    mergesort([OneElement,SecondElement], SortedList) :-
    mergelists([OneElement],[SecondElement], SortedList).
    mergesort([FirstLis|RestLis], SortedList) :-
    split([FirstLis|RestLis],[FirstSplitLis,RestSplitLis]),
    mergesort(FirstSplitLis, SortedFirstLis),
    mergesort(RestSplitLis, SortedRestLis),
    mergelists(SortedFirstLis, SortedRestLis, SortedList).
    
    mergelists([], M, M).
    mergelists(Lis, [], Lis).
    /* assume L and M are sorted lists*/
    mergelists([FirstLis|RestLis], [FirstM|RestM], [FirstLis|RestLisMerged])
    :-
    FirstLis < FirstM,
    mergelists(RestLis, [FirstM|RestM], RestLisMerged).
    mergelists([FirstLis|RestLis], [FirstM|RestM], [FirstM|RestMMerged]) :-
    mergelists([FirstLis|RestLis], RestM, RestMMerged).
    
    /* extract elements start to stop into a list */
    sublist([],_,_,_,[]).
    sublist([_|RestLis], Start, Stop, Ctr, SubList) :-
    Ctr < Start,
    NextCtr is Ctr + 1,
    sublist(RestLis, Start, Stop, NextCtr, SubList).
    sublist(_, _, Stop, Ctr, []) :-
    Ctr > Stop.
    sublist([FirstLis|RestLis], Start, Stop, Ctr, [FirstLis| SubList]) :-
    NextCtr is Ctr + 1,
    sublist(RestLis, Start, Stop, NextCtr, SubList).
    /* split the list in half:, ; returns ((first half)(second half)) */
    split([], [[],[]]).
    split([OneElement],[[OneElement],[]]).
    split(Lis, [SubLis1,SubLis2]) :-
    length(Lis,Len),
    HalfLen is Len//2,
    HalfLenPlus is HalfLen + 1,
    sublist(Lis,1,HalfLen, 1, SubLis1),
    sublist(Lis, HalfLenPlus, Len, 1, SubLis2).
    
  • GCD
    gcd(Num1, 0, Num1).
    gcd(Num1, Num2, GCD) :-
    Rem is Num1 mod Num2,
    gcd(Num2, Rem, GCD).