sintaxis - prolog tutorial
Prólogo. Estructura(término complejo) versus predicado, realmente no entiendo la diferencia (1)
En Prolog, un término es un término constante, átomo, variable o compuesto .
Un término compuesto consiste en un functor con 1 o más argumentos . Los siguientes son términos :
a. % a term with functor ''a'' and 0 arguments
a(b,c). % a term with functor ''a'' and 2 arguments, b and c
La lista vacía []
es un término y, más específicamente, un átomo . Una lista [H|T]
se representa intrínsecamente como ''.''(H, T)
y es, por lo tanto, un término compuesto y, por lo tanto, también un término .
También puede tener términos compuestos más complejos:
a(b(c,d), e(f,g(h)))
Aquí, a
es un funtor con dos argumentos: b(c,d)
y e(f,g(h))
, y así sucesivamente.
Un término compuesto también se puede llamar una estructura, ya que le dan una forma de estructurar los hechos:
customer(name(john,doe), address(street(''123 Main St''), city(''Framusville''), ...), ...).
Una cláusula predicativa es una estructura o término específico. En Prolog, todo es una estructura o término de la forma: functor(arg1, arg2, ...)
.
Veamos la cláusula predicativa:
f(X) :- a(X).
Es en sí misma una estructura que internamente se representa como este término : :-(f(X), (a(X)))
. El punto ( .
) Es un terminador. Lo que lo convierte en un predicado , como @false indica, es:
Está en el "nivel superior" (no es un argumento en un término de nivel superior)
Es functor es
:-
Una cláusula predicativa también se conoce como una regla ya que el término, :-(A, B)
define la relación : A
es verdadero si B
es verdadero . El término f(X)
se conoce como el encabezado de la cláusula predicativa.
Una colección de una o más cláusulas predicativas que tienen el mismo funtor y arity (número de argumentos) para sus cabezas se conoce como predicado .
Mirando tu segundo ejemplo:
jealous(X,Y) :- loves(X,Z), loves(Y,Z).
Esta es también una cláusula predicativa para el predicado jealous/2
(el predicado cuyo functor es jealous
y tiene arity de 2). Se expresaría internamente como este término compuesto : :-(jealous(X,Y), '',''(loves(X,Z), loves(Y,Z)))
. Esto significa que la expresión anterior también es un término compuesto .
Puede ver cómo Prolog ve una expresión en su forma canónica usando write_canonical/1
:
| ?- write_canonical((jealous(X,Y) :- loves(X,Z), loves(Y,Z))).
:-(jealous(_17,_18),'',''(loves(_17,_22),loves(_18,_22)))
El sitio de SWI Prolog tiene un muy buen glosario de términos Prolog .
Soy nuevo en Prolog y no puedo entender la diferencia entre una estructura y un predicado. Hay realmente alguna diferencia?
Mientras buscaba, encontré que algunas personas consideran que f (X): - a (X) es un predicado y algunos lo consideran celoso (X, Y): - ama (X, Z), ama (Y, Z) para ser un estructura (o un término complejo). Se ven más o menos igual para mí.
Alguien se preocupa por explicar?