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/1
pero 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.