``is''
Valor is Expresión = evalúa expresión y unifica el
resultado a valor
$ X is 3 + 5. X = 8 $ 8 is 3 + 5. yes $ 3 + 5 is 3 + 5. noExpresión debe de evaluar a algo (si no falla)
X is 5 + Y
solo si ``Y'' tiene un valor asignado
``is'' no es función de asignación
X is X + 1
falla!!
suma(X,Y,Z) :- Z is X + Y.Asumiendo que X y Y tiene valores asignados (luego vemos como podemos asegurar esto).
Otros operadores matemáticos:
-, *, /, mod, >, <, >=, =<, =:=, =\=
Factorial: Idea: fact(n) = n*fact(n-1).
factorial(N,F) :- N > 0, N1 is N - 1, fact(N1,F1), F is N * F1. factorial(0,1).Podemos mejorarlo si añadimos uno (o dos) argumentos extras. Una forma manteniendo un contador hacia arriba (desde 0 hasta N), la otra manteniendo un contador hacia abajo (desde N hasta 0).
fact(N,F) :- fact(0,N,1,F). fact(I,N,T,F) :- I < N, I1 is I + 1, T1 is T * I1, fact(I1,N,T1,F). fact(N,N,F,F).Alternativamente:
fact(N,F) :- fact(N,1,F). fact(N,T,F) :- N > 0, T1 is T * N, N1 is N - 1, fact(N1,T1,F). fact(0,F,F).
Un ejemplo parecido en donde se puede usar un argumento extra para guardar resultados intermedios: suma todos los elementos de una lista
sumalista([],0). sumalista([H|T],Res) :- sumalista(T,Res1), Res is Res1 + H. sumalista(L,R) :- sumalista(L,0,R). sumalista([H|T],Inter,R) :- Inter1 is Inter + H, sumalista(T,Inter1,R). sumalista([],R,R).
Al usar ``is'' muchas veces depende del uso que le demos al programa. Por ejemplo si queremos obtener la longitud de una lista de elementos.
long([H|T],N) :- N > 0, N1 is N - 1, long(T,N1). long([],0).
long([H|T],N) :- long(T,N1), N is N1 + 1. long([],0).
Usando sucesor el código es más sencillo y se puede usar de las dos formas:
long([H|T],s(N)) :- long(T,N). long([],0).
emorales 2012-05-03