prolog - negocios - teoria del negocio juridico guillermo ospina fernandez pdf
Prólogo: verificar la transitividad por hechos simples (1)
Sí , Prolog está inundando la pila local tan rápido.
Para ver esto, basta con considerar el siguiente fragmento de programa:
trusts(A, C) :-
trusts(A, B),
false,
trusts(B, C).
Esto se conoce como slice de falla : he insertado false/0
, de modo que todo lo que sigue a false/0
puede ignorarse . Indico partes que pueden ser ignoradas con texto tachado .
Esto significa que el fragmento es en realidad equivalente a:
trusts(A, C) :- trusts(A, B), false.
Ahora, con cualquiera de los fragmentos anteriores, obtenemos de inmediato:
?- trusts(p5, p6). ERROR: Out of local stack
Para deshacerte de este problema, debes cambiar el fragmento restante . Por esta razón, tal fragmento sirve como una explicación del problema.
Por ejemplo, considere la siguiente versión:
trusts(A, B) :- trust_direct(A, B). trusts(A, C) :- trust_direct(A, B), trusts(B, C).
Consulta de muestra:
?- trusts(p5, p6). true ; false.
Esto ahora funciona como se esperaba. Es declarativamente equivalente a la versión que ha publicado y tiene propiedades de terminación mucho mejores:
?- trusts(X, Y), false. false.
Esto muestra que el programa ahora termina universalmente .
Las soluciones alternativas son:
- use las facilidades de presentación de su sistema Prolog
- usa la definición de cierre transitivo
- etc.
Mi intención era implementar un ejemplo simple (solo para mí) de transitividad en Prolog.
Estos son mis hechos:
trust_direct(p1, p2).
trust_direct(p1, p3).
trust_direct(p2, p4).
trust_direct(p2, p5).
trust_direct(p5, p6).
trust_direct(p6, p7).
trust_direct(p7, p8).
trust_direct(p100, p200).
He escrito este predicado para verificar si A
confía en C
, que es verdadero siempre que haya un B
que confíe en C
y A
confíe en que B
:
trusts(A, B) :-
trust_direct(A, B).
trusts(A, C) :-
trusts(A, B),
trusts(B, C).
El predicado devuelve true
para trusts(p1, p2)
o trusts(p1, p5)
por ejemplo, pero trusts(p5, p6)
ya devuelve ERROR: Out of local stack
.
¿Prolog está inundando la pila tan rápidamente?
¿O es mi idea / implementación de los trusts
mala / pérdida de memoria del sistema?