Pregunta

El operador de tubería en Prolog devuelve una o más cabezas atómicas y una lista de cola.

?- [a,b,c] = [a,b|[c]].
true.

Anidar múltiples tuberías en una sola coincidencia se puede hacer similar a esto:

?- [a,b,c] = [a|[b|[c]]].
true.

¿Qué hace la declaración? [a|b|c] inferir sobre A, B y C?

EDITAR

Hasta ahora, todo lo que puedo deducir es:

?- [a,b,c] = [a|b|c].
false.

Estoy más interesado en cualquier técnicas Para encontrar la respuesta en lugar de responder a esta pregunta inútil fríer.

Edición2
Claramente no estoy muy familiarizado con Prolog, una tarea simple respondió a mi pregunta ...

?- R = [a|b|c].
R = [a| (b'|'c)].

¿Qué está pasando exactamente con (b'|'c)?

¿Fue útil?

Solución

Como soy tu profesor I, aquí está mi respuesta.
(Ah, y puedo confirmar que esto no es tarea, está relacionado con el examen de práctica).

La sintaxis [a|b|c] En realidad, no parece ser un prólogo estándar, y algunas implementaciones lo interpretan de manera diferente. (Si hubiera sabido esto, podría no haberlo usado).

Algunos lo interpretan como [a|[b|c]]. (Como pretendía).

Pero con Swi Prolog (y probablemente otros):

?- [a|b|c] = [a|[b|c]].
false.

los (b '|' c) en realidad está construido usando '|' más bien que '.' Como sería una lista. Entonces, el segundo | no se interpreta como parte de la construcción de una lista en absoluto.

Para confirmar esto, lo siguiente tiene éxito:

   ?- X=(b|c), [a|b|c] = [a|X].
   X = (b'|'c) .

los '|' Aquí parece haber otro operador binario en términos como '.'.

En vez de [a|b|c] El estándar en Prolog es usar [a,b|c].

(Solo decidí usar [a|b|c] en paradigmas de programación porque se relaciona más directamente con la notación a::b::c De f#, y solo vimos un pequeño vistazo de Prolog. En el futuro, supongo que me identificaré con [a|[b|c]] y luego dar [a,b|c] como abreviatura.)

Otros consejos

No es una declaración, es un término, y no implica nada en absoluto sobre a, b o c. Simplemente construye una lista inadecuada.

Para elaborar: el [|] La sintaxis es en realidad azúcar sintáctica para el .() operador. Las listas se construyen internamente a través de '.'(a,[]), pero dado que eso se vuelve extremadamente tedioso de escribir de inmediato, se le permite escribir [a] en cambio. Entonces el . Se supone que el operador toma una cosa y una lista y luego controla una lista más larga, pero dado que no hay escritura, nadie le impide aplicarla a dos átomos, o cualquier otro par de cosas. El resultado es una estructura en la que algunas operaciones de lista tienen éxito y otras fallan. Esto a veces es útil (piense en árboles binarios), pero no tan común como listas, por lo tanto, no hay una sintaxis de lectura especial para ello.

(Lo mismo sucede con el cons operador en Lisp; Si google "Lista incorrecta" de Google, puede obtener muchos más resultados sobre LISP, pero el principio es exactamente el mismo).

Dentro de iso-prolog, [a|b|c] es sintaxis no válida. Y mientras tanto también dentro de SWI. Parece que usaste una versión anterior. Algunos sistemas de prólogo le dieron a este término alguna interpretación. Por desgracia, todos diferían de la manera muy precisa de cómo interpretaron ese término. Algunos como [(a'|'b)|c] o [a|(b'|'c)] o [a|(b;c)] ... Bueno, lo entiendes.

Relacionado con esto está el uso de la barra como operador Infix ('|')/2.

Con ISO/IEC 13211-1: 1995/Cor.2: 2012, Technical Corrigendum 2, publicado 2012-02-15 El uso de la barra | Como el operador Infix ahora se define con precisión. Antes de eso | tuvo que ser citado. Aquí es su borrador.

Ahora, '|' se puede definir como un operador infix pero solo con una prioridad por encima de 1000. De esta manera, de otra manera casos ambiguos como [a|b|c] permanecer sintácticamente inválido, pero usos de | para DCG y CHR son válidos.

Si quieres aprender sintaxis probándola, lo mejor es usar writeq/1 y write_canonical/1.

La sintaxis de ISO-Prolog más conforme WRT es GNU Prolog.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top