2012-09-25 22 views

Respuesta

5

Por lo que puedo encontrar core.logic no puede hacer el álgebra para resolver esta ecuación. Se puede hacer operaciones matemáticas básicas, aunque las entradas a que las matemáticas tienen que ser valores reales no LVar s debido a que las funciones matemáticas no pueden operar en éstos:

user> (run* [q] 
    (fresh [x] 
     (== x 1) 
     (project [x] (== q (+ (* x x) 4))))) 
(5) 

obras cuando x tiene un valor claro y falla cuando x no lo hace :

user> (run* [q] 
    (fresh [x] 
     (== x q) 
     (project [x] (== q (+ (* x x) 4))))) 
ClassCastException clojure.core.logic.LVar cannot be cast to java.lang.Number 
5

Debería leer The Reasoned Schemer para obtener ideas. Básicamente, la forma de hacer matemática en un programa lógico es crear codificaciones de números basadas en listas, que el motor lógico puede crecer según sea necesario para probar cosas. No tengo el libro a mano, pero codifica enteros como una lista de bits, de alguna manera extraña que no puedo recordar: tal vez (1) representa 0, (0) es ilegal, y el MSB es el último en la lista?

De todos modos, eso es mucho trabajo; David Nolen también ha introducido recientemente algo sobre dominios finitos en core.logic. No sé cómo funcionan, pero creo que simplifican mucho el problema permitiéndote especificar qué tipos de números considerar como una solución a tu problema.

+0

he encontrado una página https://github.com/frenchy64/Logic-Starter/wiki/Aritmética que lo atraviesa – zcaudate

+0

supongo que arithmatic no es realmente el dominio de core.logic atm – zcaudate

2

core.logic en su forma actual no está diseñado como un solucionador de ecuaciones numéricas - es más apropiado para resolver expresiones lógicas y relacionales.

Usted tiene básicamente dos rutas prácticas para la solución de ecuaciones matemáticas:

  • solucionadores analíticos - se pueden encontrar soluciones con bastante facilidad para los casos simples, por ejemplo, Ecuaciones cuadráticas como la que tiene arriba, pero comienzan a hacerse cada vez más complejas con bastante rapidez y luego se vuelven imposibles/inviables para muchas ecuaciones. Este es un gran tema de investigación abierto.
  • Solucionadores numéricos - estas técnicas son mucho más generales y se pueden utilizar en casi cualquier tipo de ecuación. Sin embargo los resultados no son exactos y los algoritmos pueden no encontrar la solución (s) correcta si la ecuación tiene características "desagradables" (discontinuidades, gradientes impares, complejos conjuntos de mínimos locales, etc.)

solucionadores de ecuaciones requieren inteligencia especial para comprender las "reglas" de las ecuaciones matemáticas, por ejemplo cómo factorizar expresiones polinomiales (para soluciones analíticas) o cómo estimar una derivada (para soluciones numéricas).

Algunos enlaces que pueden ser interesantes:

Cuestiones relacionadas