Skip to content

Instantly share code, notes, and snippets.

@stmtk1
Created April 7, 2023 11:41
Show Gist options
  • Save stmtk1/9ec2c4fbe822ce3c7f050950714b93d1 to your computer and use it in GitHub Desktop.
Save stmtk1/9ec2c4fbe822ce3c7f050950714b93d1 to your computer and use it in GitHub Desktop.
my_fact(0, 1).
my_fact(N, P) :- N > 0, M is N - 1, my_fact(M, Q), P is Q * N.
my_sum([], 0).
my_sum([H|R], S) :- my_sum(R, S1), S is S1 + H.
insert(0, E, L, [E|L]).
insert(At, E, [H|L1], [H|L2]) :- At1 is At - 1, insert(At1, E, L1, L2).
my_length([], 0).
my_length([_|L], N) :- my_length(L, N1), N is N1 + 1.
my_append([], X, X).
my_append([H|X], Y, [H|Z]) :- my_append(X, Y, Z).
reverse_internal([], X, X).
reverse_internal([H|X], Y, Z) :- reverse_internal(X, [H|Y], Z).
my_reverse(X, Y) :- reverse_internal(X, [], Y).
sorted_insert(X, [], [X]).
sorted_insert(X, [H|R1], [H|R2]) :- X > H, sorted_insert(X, R1, R2).
sorted_insert(X, [H|R], [X, H|R]) :- X =< H.
insert_sort([], []).
insert_sort([H|R], B) :- insert_sort(R, I), sorted_insert(H, I, B).
select_min([X], X).
select_min([H|R], H) :- select_min(R, M), H < M.
select_min([H|R], M) :- select_min(R, M), H >= M.
remove_val(H, [H|R], R).
remove_val(X, [H|R1], [H|R2]) :- remove_val(X, R1, R2).
select_sort([], []).
select_sort(X, [M|Sorted]) :- select_min(X, M), remove_val(M, X, Removed), select_sort(Removed, Sorted).
bubble_sort_inner([], []).
bubble_sort_inner([X], [X]).
bubble_sort_inner([H1, H2|R], [H1|Sorted]) :- H1 < H2, bubble_sort_inner([H2|R], Sorted).
bubble_sort_inner([H1, H2|R], [H2|Sorted]) :- H1 >= H2, bubble_sort_inner([H1|R], Sorted).
bubble_sort([], []).
bubble_sort([H|R], X) :- bubble_sort(R, Sorted), bubble_sort_inner([H|Sorted], X).
split_list(X, L, [], X) :- length(X, L).
split_list([H|X], L, [H|Y], Z) :- length([H|X], L1), L1 > L, split_list(X, L, Y, Z).
merge_sorted([], A, A).
merge_sorted(A, [], A).
merge_sorted([XH|XR], [YH|YR], [XH|Sorted]) :- XH < YH, merge_sorted(XR, [YH|YR], Sorted).
merge_sorted([XH|XR], [YH|YR], [YH|Sorted]) :- XH >= YH, merge_sorted([XH|XR], YR, Sorted).
merge_sort([], []).
merge_sort([X], [X]).
merge_sort(X, Y) :- length(X, XL), Half is XL // 2, split_list(X, Half, Left, Right), merge_sort(Left, LeftSorted), merge_sort(Right, RightSorted), merge_sorted(LeftSorted, RightSorted, Y).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment