%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% PROG. LOGICA, CONHECIMENTO E RACIOCINIO - MIEB/4

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% SEMANA 02: 01.OUT.2012

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
% Base de Conhecimento - Aritmetica (Ficha2) / Listas (Ficha3)
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%I
%Extensao de um predicado que calcule a soma de dois valores: A,B,R -> {V,F}

soma(A,B,R) :-
    R is A+B.

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%II
%Extensão de um predicado que aplique uma funcao aritmetica a dois valores: A,B,O,R -> {V,F}

operacao(A,B,+,R) :-
    R is A+B.
operacao(A,B,-,R) :-
    R is A-B.
operacao(A,B,/,R) :-
    Y \= 0.
    R is A/B.
operacao(A,B,*,R) :-
    R is A*B.

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%III(Ficha3)
%Extensao do predicado "pertence" que verifica se um elemento existe dentro de uma lista de elementos: X,L -> {V,F}

pertence(X,[X|L]).
pertence(X,[Y|L]) :-
    X \== Y,
    pertence(X,L).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%IV (Ficha3)
%Extensao do predicado "comprimento", capaz de calcular o número de elementos existentes numa lista: L,N -> {V,F}

comprimento([],0).
comprimento([X|L],N) :-
    comprimento(L,M),
    N is M+1.

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%V (Ficha3)
%Extensao do predicado "quantos", capaz de calcular a quantidade de elementos que existem numa lista: L,N -> {V,F}

quantos([],0).

quantos([X|L],R) :-
    pertence(X,L),
    quantos(L,R).

quantos([X|L],R+1) :-
    nao(pertence(X,L)),
    quantos(L,R).
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%VI (Ficha3)
%Extensao do predicado "apagar", capaz de apagar a primeira ocorrência de um elemento na lista: X,L,R -> {V,F}

apagar(X,[],[]).

apagar(X,[X|T],T).

apagar(X,[H|T],[H|L]) :-
    apagar(X,T,L).
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%IX (Ficha3)
%Extensao do predicado "concatenar", que resulta na concatenação dos elementos da Lista L1 com os elementos da Lista L2: L1,L2,T -> {V,F}

concatenar([],L2,L2).

concatenar([H|L1],L2,[H|T]) :-
    concatenar(L1,L2,T).
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%XI (Ficha3)
%Extensao do predicado "sublista", que deve determinar se uma lista S é considerada uma sublista de outra lista L: S,L-> {V,F}

sublista(S,L) :-
    concatenar(L1,L3,L).
    concatenar(S,L2,L3).
%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%V
%Extensao de um predicado que calcule a soma de tres valores: A,B,C,R -> {V,F}

somatres(A,B,C,R) :-
    R is A+B+C.

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%VI
%Extensao de um predicado que calcule o maior valor entre dois numeros: X,Y,R -> {V,F}

max(X,Y,X) :-
    X > Y.
max(X,Y,Y) :-
    X =< Y.

max2(X,Y,X) :-
    X > Y.
max2(X,Y,Y).

max3(X,Y,X) :-
    X > Y, !.
max3(X,Y,Y).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%XI
%Extensao de um predicado que calcule o valor de verdade contrario a resposta a uma questao: Q -> {V,F}

nao(Q) :-
    Q,!,fail.
nao(Q).

%--------------------------------- - - - - - - - - - -  -  -  -  -   -
%

