Saltar al contenido

Equivalencia del operador de disyunción y definición con varias reglas

Este artículo fue evaluado por especialistas así garantizamos la veracidad de esta reseña.

Solución:

¿No significaría eso que ;/2 se comporta exactamente como si escribiésemos nuestro propio predicado auxiliar que consta de dos reglas?

No. La conversión de término a cuerpo marca la diferencia.

Pero primero, es (;)/2 que se define en ambas cosas 7.8.6 (disyunción) y 7.8.8 (if-then-else), como sugiere la primera oración en 7.8.6. Para los soportes redondos alrededor ; ver la nota en 7.1.6.6.

Entonces, la primera pregunta es cómo es posible decidir qué subcláusula se aplica en caso de que vea ( G_0 ; H_0 ) en tu programa Esto no depende de la instanciación presente al llamar (;)/2 sino que depende de la instanciación durante la conversión de término a cuerpo (7.6.2).

?- G_0 = ( true -> X = si ), ( G_0 ; X = nisi ).
   G_0 =  (true->si=si),
   X = si
;  G_0 =  (true->nisi=si),
   X = nisi.

?- G_0 = ( true -> X = si ), call( ( G_0 ; X = nisi ) ).
   G_0 =  (true->si=si),
   X = si.

En la primera consulta, la conversión de término a cuerpo reemplaza dentro de la disyunción G_0 por call(G_0) y por lo tanto

( call( ( true -> X = si ) ) ; X = nisi ) )

será ejecutado.

En la segunda consulta, hay dos conversiones de término a cuerpo, una para toda la consulta y otra para la explícita. call/1pero ambos dejan todo como está, y así

call( ( true -> X = si ; X = nisi ) )

se ejecutará y el caso else se omitirá.

Otras diferencias debidas a la conversión de término a cuerpo son para cortes y errores debido a cuerpos malformados.

Hasta donde yo sé, definir

p(X) :- G1 ; G2 .

es lo mismo que definir

p(X) :- G1 .
p(X) :- G2 .

Y sí, estás mezclando esto ; con algo relacionado pero completamente diferente _ -> _ ; _.

Calificaciones y comentarios

Puedes añadir valor a nuestro contenido contribuyendo tu veteranía en las críticas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *