prolog - reglas - Prólogo: ¿Puedes hacer que un predicado se comporte de manera diferente dependiendo de si un valor está molido o no?
prolog tutorial (1)
Tengo un predicado un tanto complejo con cuatro argumentos que deben funcionar cuando tanto el primer argumento como el último son tierra / tierra, tierra / suelo o tierra / suelo, y el segundo y tercer argumentos son sólidos.
es decir, predicado (A, B, C, D).
No puedo proporcionar mi código real ya que es parte de una tarea.
Lo tengo funcionando principalmente, pero estoy recibiendo errores de instanciación cuando A no está en tierra, pero D sí. Sin embargo, he seleccionado una línea de código que está causando problemas. Cuando cambio el orden de los objetivos del predicado, funciona cuando D es tierra y A no lo es, pero al hacerlo, ya no funciona cuando A es tierra y D no lo es. No estoy seguro de que haya una forma de evitar esto.
¿Hay alguna manera de usar ambas líneas de código para que, si A es tierra, por ejemplo, usará la primera línea, pero si A no está en tierra, usará la segunda e ignorará la primera? Y viceversa.
Puedes hacerlo, pero , casi invariablemente, romperás la semántica declarativa de tus programas si lo haces.
Considere un ejemplo simple para ver cómo un predicado no monotónico y extra-lógico ya rompe las suposiciones básicas y las propiedades declarativas típicas de los predicados conocidos, como la conmutatividad de la conjunción:
?- ground(X), X = a. false.
Pero, si simplemente intercambiamos los objetivos por conmutatividad de la conjunción, obtenemos una respuesta diferente :
?- X = a, ground(X). X = a.
Por esta razón, es mejor evitar dichos predicados meta-lógicos, especialmente si recién está empezando a aprender el idioma.
En cambio, mejor permanecer en el subconjunto puro y monótono de Prolog. Use restricciones como dif/2
y CLP (FD) para hacer que sus programas se puedan usar en todas las direcciones, aumentando la generalidad y la facilidad de comprensión.
Consulte pureza lógica , prolog-dif y clpfd para obtener más información.