Documentos de Académico
Documentos de Profesional
Documentos de Cultura
X = Y %unificacion. Simbolica
X == Y %comparacion simbolica.
Ejemplo:
?- X is 3+5.
X=8
?- X = 3+5.
X = 3+5
?-3 +5 =:= 2+6.
Yes
3+5== 2+6.
No
3+5 == 3+5
Yes
N a t u r a l (0 ).
n a t u r a l (s (X)) : − n a t u r a l (X ) .
Compilar el programa anterior y comprobar si el dos (s(s(0))) es un número
natural mediante la llamada natural(s(s(0)) Observar las respuestas del sistema
ante la pregunta natural(X)
0+X=0
0∗X=0
Si X ∗ Y = Z entonces s(X) ∗ Y = Z + Y
• [] = []
• [c [] ] = [c]—
• [b [c— [] ] ] = [b,c]—
Un recorrido en un árbol binario es Una operación que consiste en visitar todos sus
vértices o nodos, de tal manera que cada vértice se visite una sola vez.
Se distinguen tres tipos de recorrido: INORDEN, POSORDEN Y PREORDEN.
En cada recorrido se tiene en cuenta la posición de la raíz (de ahí su nombre) y
que siempre se debe ejecutar primero el hijo izquierdo y luego el derecho.
Árboles de expresión
Son árboles binarios que se utilizan para almacenar en la memoria de una
computadora expresiones lógicas, aritméticas o algebraicas. Este proceso lo
realizan los compiladores de los lenguajes de programación. Los PC y las
calculadoras comunes utilizan el recorrido INORDEN usando la notación infija para
evaluar las expresiones, al igual que los seres humanos. El recorrido PREORDEN
utiliza la notación infija o polaca.
Algunos compiladores y algunas calculadoras como por ejemplo, la Hewlet Packard
evalúan las expresiones en POSORDEN usando la notación posfija (o notación
polaca inversa) donde el operador aparece después de sus operandos; por
ejemplo, AB/ indican que A debe dividirse por B. Observe que la notación posfija
tiene ventajas sobre la notación infija debido a que la notación posfija no necesita
paréntesis ni tiene que predeterminar un orden de prioridad para sus operadores
(lógicos o aritméticos); es por tal razón que una expresión se evaluará sin
ambigüedad.
Una expresión con recorrido INORDEN pueden seguirse los siguientes pasos:
EJEMPLO:
Si Denimos:
Masuno(X,Y): - Y is X+1.
Xmasuno(X,Y): - Y=+1.
Obersvaremos el siguiente
Comportamiento:
?-masuno (,5).
Yes
En este tema veremos aspectos del control en PROLOG. En primer lugar, cómo
afecta el orden de los literales y de las sentencias en el funcionamiento del
programa. Ya hemos visto cómo crear el árbol de llamadas y cómo explorarlo
siguiendo una estrategia SLD. Sin embargo, muchas veces al programar y
conociendo las características del problema, se puede asegurar que cierta parte
del árbol no dará lugar a soluciones y por tanto no necesitaría ser explorada. Para
indicar a PROLOG cuestiones de este estilo y ganar en eficiencia, disponemos del
operador corte del que hablaremos en las dos siguientes secciones. Finalmente,
dedicamos la última sección a estudiar la negación como fallo finito y su relación
con la negación lógica.
4.7 Control de búsqueda en programas logicos
El orden en que aparecen los literales dentro de una sentencia (dentro del cuerpo)
o el orden en que se introducen las sentencias en el programa son importantes en
PROLOG. El orden afecta tanto al correcto funcionamiento del programa, como al
recorrido del árbol de llamadas, determinando, entre otras cosas, el orden en que
PROLOG devuelve las soluciones a una pregunta dada. El orden de las
sentencias determina el orden en que se obtienen las soluciones ya que varía el
orden en que se recorren las ramas del árbol de búsqueda de soluciones.
Ejemplo: A continuación se presentan dos versiones del programa "miembro de
una lista". Ambas versiones tienen las mismas sentencias pero escritas en distinto
orden. A ambas versiones les hacemos la misma pregunta ?miembro (X, [1,2,3]).
P: - q1,…,qn !, r1,…,rm
Ejemplo
Incl..st2([ ], [ ]).
El Predicado Functor/3
Al ser reversible, también permite construir nuevos términos a partir del functor y la
aridad deseada
Ejemplo:
?- arg(2,termino(a,b,c,d),ARG).
ARG = b ?
yes
?-
Si el término tiene variables libres como argumento, se les puede asignar valor
mediante arg/3. Pero el resultado es el mismo que una simple unificación
mediante =/2. Esto se observa en el siguiente ejemplo:
yes
?-
?- p(a,b,c(i)) =.. X.
X = [p,a,b,c(i)] ?
yes
?-
Termino = functor(arg1,arg2,arg3) ?
yes
?-
% Un predicado
mipred(X) :-
display(X),
nl.
sujeto(12).
sujeto(13).
sujeto(78).
aplicar(Predicado) :-
sujeto(X),
LLamada =.. [Predicado,X],
call(LLamada),
fail.
aplicar(_).
ejemplo :-
aplicar(display).
El resultado es el siguiente:
?- ejemplo.
12
13
78
yes
?-
not(Objetivo) :-
call(Objetivo),
!,
fail.
not(_).
Chequeo De Tipo:
Predicado:
Var(x)
|?- var(x)
X=_
No.
Predicado:
nonvar(x)
Ejemplo:
|?- novar(x)
No
X-1
Abuelo(X,Y):-novar(X)
abuelo(x,y):-novar(y)
abuelo(x,y):- X es abuelo Y
Bibliografias
https://prezi.com/wzpdx9r407pp/411-manipulacion-de-terminos-412-
predicados-metalogicos/
https://programacion.nt/articulo/curso_avanzado_de_prolog_166/4
http://eclipseclp.org/doc/bips/kernel/termmanip/functor-3.html
https://diegoandrescalvolopez.blogspot.com/2019/