portable - prolog online
Array Univ var([x, y]=.. T)-prólogo (2)
Esto sucede porque la representación de la lista en prolog es una estructura de árbol, como esta. Su nodo superior es un "punto", el lado izquierdo es Cabeza y luego un punto a la derecha si la cola no está vacía y la cabeza en el lado izquierdo y "punto" en el lado derecho. Cuando haces esto, simplemente estás creando un predicado (bueno, no un predicado exacto, pero a veces se necesita como muestro un ejemplo): supongamos que escribo:
V=..[somefunctor,X,Y,Z]
Entonces construirá automáticamente un predicado como este:
somefunctor(X,Y,Z).
Ahora ¿Por qué necesitamos esto? Supongamos que llamo a un predicado con estos términos: predicate(somefunctor,term,term2,term3)
y predicate o rule se ve algo como esto: predicate(X,Y,Z,T)
y te pido que no importa qué predicado esté en X , tienes que llamar a este predicado con los parámetros Y,Z,T
Puede ser que pienses que llamas a ese predicado escribiendo de esta manera: X(Y,Z,T)
pero desafortunadamente no está permitido en prólogo, así que aquí puedes usar V = .. [X, Y, Z, T] donde X debe colocarse como primer argumento porque es el nombre del predicado y como resultado se obtiene algo como esto: V = somefunctor(term,term2,term3)
y esto ocurre internamente. Para invocar este predicado, utiliza el predicado de llamada:
call(V) where `call/1` is a metapredicate and `V=..` is a not logical predicate.
Vi una pregunta preguntando qué hace [a,b,c]=..L.
regreso. Al probar esto, vi que devuelve: L = [''.'', a, [b, c]]
.
No puedo entender por qué sucede esto, no pude entender la naturaleza de Univ de la documentación . Comprender esto me ayudará a entender Univ.
Una forma de aprender más sobre los términos es usar write_canonical/1
en un sistema Prolog conforme.
Por ejemplo, con GNU Prolog, obtenemos:
| ?- write_canonical([x,y]). ''.''(x,''.''(y,[]))
Esta espectáculos:
- el functor primario en este término es
''.''
, con arity 2 - el primer argumento es
x
- el segundo argumento es
''.''(y, [])
, que es la lista[y]
Esto explica por qué (=..)/2
cede:
| ?- [x,y] =.. Ls. Ls = [''.'',x,[y]]
y también tu otro ejemplo.