p(1). p(2). % numar p(a). % literal p([1,2,3]). % lista q(X, X) :- p(X). % :- = "dacă" % predicatul q este adevărat dacă ambele argumente ale lui sunt același lucru și dacă p(argument al lui q) este adevărat any(X, X). % any(X, Y) :- X = Y. % identic cu any(X, X). t(X) :- \+ p(X). % \+ negatie - nu poate demonstra ca p(X). s(X) :- member(X, [1,2,3,4,5,a,b,c,d,[1],[2],[1,2,3]]), \+ p(X). %any2(X, Y). any2(_, _). % myMember/2 % myMember(+Elem, +Lista) myMember(_, []) :- false. myMember(X, [H | _]) :- X == H. myMember(X, [H | T]) :- X \= H, myMember(X, T). % nu am nevoie să exprim ce lucruri sunt false % Prolog nu va găsi o afirmație pentru cazul în care lista este % vidă -> în acest caz, myMember este fals. myMember2(X, [H|T]) :- X == H ; myMember2(X, T). % ";" = "sau" % sau myMember3(E, [E|_]). % E este membru într-o listă în care E este primul element. myMember3(E, [_|T]) :- myMember3(E, T). % E este membru într-o listă în care E este membru în tail % sumList(+L, -Suma) sumList([], 0). sumList([H | T], Sum) :- sumList(T, SumTail), Sum is H + SumTail . intre(X, Y, Z) :- X > Y, X < Z. % nu poate genera solutii pentru X intre Y si Z. % incList ~ map (+1) % incList/2 % incList(+LIn, -LOut) incList([], []). incList(LIn, LOut) :- [H|T] = LIn, % iau H și T ca formând LIn incList(T, TInc), % incrementez restul listei la un TInc HInc is H + 1, % incrementez pe H, la un HInc LOut = [HInc | TInc]. % construiesc pe LOut ca listă formată din H1 și T1 incList2([], []). incList2([H|T], [HInc|TInc]) :- HInc is H+1, incList2(T, TInc). % incList2 este adevărat pentru două liste nevide, unde % primul element din a doua listă este primul element din prima listă plus 1 % iar incList2 este adevărat pentru restul din prima listă și restul din % a doua listă