teoría teoria ospina negocios negocio los jurídicos juridicos juridico hecho guillermo general fernandez demás contrato clasificacion actos acto prolog predicate failure-slice transitive-closure transitivity

prolog - negocios - teoria del negocio juridico guillermo ospina fernandez pdf



Prólogo: verificar la transitividad por hechos simples (1)

, 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?