Skip to content

Instantly share code, notes, and snippets.

@majk-p
Created May 16, 2016 21:48
Show Gist options
  • Save majk-p/705a1ae52be90cc0039a2e5ed987e9f3 to your computer and use it in GitHub Desktop.
Save majk-p/705a1ae52be90cc0039a2e5ed987e9f3 to your computer and use it in GitHub Desktop.
Prolog 2
% Contains
cont([], _, Result):- Result is 0.
cont([E|_], E, Result) :- Result is 1.
cont([_|T], E, Result) :- cont(T, E, Result).
:- cont([1,2,3], 3, R), write(R), nl.
% Appearance counter
cnt(_, [], Sum, Sum).
cnt(Elem, [Elem|T], Sum, R) :- Count is Sum + 1, cnt(Elem, T, Count, R).
cnt(Elem, [_|T], Sum, R) :- cnt(Elem, T, Sum, R).
cnt(Elem, L, Result) :- cnt(Elem, L, 0, Result).
:- cnt(1, [1,2,3,1,1], S), write(S), nl.
% Remove appearance
rmv(_, [], L, L).
rmv(E, [E|T], L, R) :- rmv(E, T, L, R).
rmv(E, [A|T], L, R) :- append(L, [A], NL), rmv(E, T, NL, R).
rmv(E, L, R) :- rmv(E, L, [], R).
:- rmv(3, [2,3,5,3,1,4], L), write(L), nl.
% Last element
last_elem([E|[]], E).
last_elem([_|T], L):-last_elem(T, L).
:- last_elem([3,1,2], Elem), write(Elem), nl.
% Join lists
join(L1, L2, L3) :- append(L1, L2, L3).
:- join([1,2], [3,4,5], Target), write(Target), nl.
% List reverse
rev([], R, R).
rev([E|T], R, Res) :- append([E], R, Rev), rev(T, Rev, Res).
rev(List, R) :- rev(List, [], R).
:- rev([1,2,3], Res), write(Res), nl.
% List summary
add([E|[]], Sum, Count):- Count is Sum + E.
add([E|T], Sum, Ret) :- Count is Sum + E, add(T, Count, Ret).
add(List, Ret) :- add(List, 0, Ret).
:- add([3,3,3], Sum), write(Sum), nl.
% List summary - alternative
alt_sum([], Sum, Sum).
alt_sum([E|T], Sum, Ret) :- Count is Sum + E, alt_sum(T, Count, Ret).
alt_sum(List, Ret) :- alt_sum(List, 0, Ret).
:- alt_sum([3,3,3], R), write(R), nl.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment