Código Fonte
vinte_e_um(L,T,N):-aplica_negacao(L,L1),resto_operadores(L1,T,N).
%%% Negando os numeros da Lista %%%%
aplica_negacao([],[]).
aplica_negacao([X|Cauda],[Y|Cauda1]):-neg(X,Y),
aplica_negacao(Cauda,Cauda1).
neg(X,X).
neg(X,(-X)).
%%% Aplicando os operadores %%%%
resto_operadores(L1,T,N):-aplica_operadores(L1,L2),
L2=[T],
T1 is T,
T1==N.
aplica_operadores(L,L).
aplica_operadores([X,Y|Cauda],L2):-operadores(Y,X,E),
aplica_operadores([E|Cauda],L2).
%%% Fatos e regras com operadores %%%%
operadores(X,Y,(X+Y)).
operadores(X,Y,(X*Y)).
operadores(X,Y,(X/Y)):-Y=\=0.
operadores(X,Y,(Y/X)):-X=\=0.
Predicados - Considerações:
aplica_negacao / 2 = dada uma lista aplica-se a negação a cada número da lista através de um processo recurssivo.
neg / 2 = nega o número da lista instanciado pelo "aplica_negaçao".
resto_operadores / 3 = aplica as operações na lista gerada por "aplica_negação" (L2), instancia em "T" a lista gerada pelo "aplica_operadores" L2=[T], atribui a "T1" o valor resultante de "T" e faz a comparação de "T" com o resultado pré-estabelecido "N".
aplica_operadores / 2 = a partir da lista gerada pelo "aplica_negacao" irá combinar as operações de adição, multiplicação e divisão com os respectivos números que compõe a lista através de um processo recursivo. A operação de negação estabelece a subtração sob a forma de "+ ( - N )".
Operadores / 3 =compõe as bases de fatos e regra para as operações.
|