frumos(astazi). frumos(ieri). % frumos(maine) :- false. % fail frumos(Zi) :- zi(Zi), \+ ploua(Zi). % nu se poate demonstra ca ploua(Zi) % :- = "dacă" (seamana cu <= ) % , = si % ; = sau ploua(maine). ploua(intai_mai). zi(maine). zi(poimaine). zi(intai_mai). zi(doi_mai). zi(treizeci_aprilie). % Alice came across a lion and a unicorn in a forest of forgetfulness. % Those two are strange beings. % The lion lies every Monday, Tuesday and Wednesday % and the other days he speaks the truth. % The unicorn lies on Thursdays, Fridays and Saturdays, % however the other days of the week he speaks the truth. % Lion: Yesterday I was lying. % Unicorn: So was I. % Which day did they say that? days([mon, tue, wed, thu, fri, sat, sun]). % is_next/3 % is_next(+Day, +NextDay, +DaysList) is_next(D1, D2, [D1, D2 | _]). is_next(D1, D2, [_|RestDays]) :- is_next(D1, D2, RestDays). yesterday(Today, Yesterday) :- days(Days), %member(Today, Days), %member(Yesterday, Days), is_next(Yesterday, Today, Days). yesterday(mon, sun). lies(lion, [mon, tue, wed]). lies(unicorn, [thu, fri, sat]). saysTodayLiedYesterday(Today, Animal) :- % days(Days), member(Today, Days), lies(Animal, DaysLies), yesterday(Today, Yesterday), \+ member(Today, DaysLies), member(Yesterday, DaysLies). saysTodayLiedYesterday(Today, Animal) :- % days(Days), member(Today, Days), lies(Animal, DaysLies), yesterday(Today, Yesterday), member(Today, DaysLies), \+ member(Yesterday, DaysLies). today(Today) :- saysTodayLiedYesterday(Today, lion), saysTodayLiedYesterday(Today, unicorn). % myMember(?E, +L) myMember(E, [E|_]). %myMember(E, L) :- [H|T]=L, myMember(E, T). myMember(E, [_|T]) :- myMember(E, T). % first_two(+L, -E1, -E2) %first_two(L, E1, E2) :- [E1, E2 | _]=L. first_two([E1, E2 | _], E1, E2). sumList([], 0). sumList([H|T], Sum) :- sumList(T, SumTail), Sum is H + SumTail. % any(X). any(X) :- display(X). % sau: any(X) :- format("X este: ~w~n", [X]). any(X, X). % încercați: % ?- any(X, Y). % any(X, Y) :- X = Y. % identic cu any(X, X). % any(X, Y) :- X is Y. % încercați any(X, 1+2) cu ambele variante de implementare de mai sus. % la consolă vad 'ce legări s-au forțat ca să fie adevarat?'. /* de executat la consolă: ?- any(X,Y), X = 5. X = Y, Y = 5. ?- any(X,Y), Y = 5. X = Y, Y = 5. ?- [1,2,3] = [1,2,3]. true. ?- [1,X,Y] = [1,2,3]. X = 2, Y = 3. ?- [1,X,Y] = [Z,2,3]. X = 2, Y = 3, Z = 1. ?- [1,X,Y] = Z. Z = [1, X, Y]. ?- [1,X,Y] = Z, (X,Y)=(2,3). X = 2, Y = 3, Z = [1, 2, 3]. ?- */ % puterea generativă a limbajului % ?- member(1, [1,2,3]) % ?- member(X, [1, 2, 3]). % ?- member(1, L). % ?- length(L, 3), member(1, L), member(2, L), member(3, L). inInterval(0, _). inInterval(X, Max) :- inInterval(Y, Max), Y < Max, X is Y + 1. %inInterval2H(Iterator, _, Solutie) :- Solutie = Iterator. inInterval2H(Iterator, _, Iterator). inInterval2H(Iterator, Max, Solutie) :- Iterator < Max, IteratorInc is Iterator + 1, inInterval2H(IteratorInc, Max, Solutie). inInterval2(X, Max) :- inInterval2H(0, Max, X). % ! este operatorul "cut" myMem(E, [E|_]) :- !. % conditiile predicatului sunt evaluate doar daca se potriveste patternul myMem(E, [_|T]) :- myMem(E, T). este(lili, liliac). este(fifi, papagal). zboara(liliac). zboara(papagal). pasare(X) :- este(X, liliac), !, false. pasare(X) :- este(X, Ceva), zboara(Ceva). % implementare inInterval cu cut: inInterval3(0, _). % dacă am ajuns la Max, tai toate alternativele; altfel continui așa inInterval3(X, Max) :- inInterval3(Y, Max), Y < Max, X is Y + 1, (X == Max, ! ; true).