2012-09-25 15 views
8

Ho provato a digitare in una query in core.logic:Come risolvere equazioni matematiche utilizzando core.logic

(run* [q] (== 0 (+ (* q q) (* 4 q) 4))) 

E prompt dice,

error: lvar cannot be cast to a number 

Nel caso in cui non ho completamente confuso su cosa sia la programmazione logica, ci sono modi in cui questo problema può essere risolto usando core.logic?

risposta

5

Per quanto posso trovare core.logic non può fare l'algebra per risolvere questa equazione. Si può fare la matematica di base se gli ingressi a che la matematica devono essere valori reali non LVar s perché le funzioni matematiche non possono operare su questi:

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

opere quando x ha un valore chiaro e fallisce quando non lo fa x :

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

Si dovrebbe leggere Schema ragionato per le idee. Fondamentalmente il modo di fare matematica in un programma di logica è creare codifiche di numeri basate su elenchi, che il motore logico può far crescere secondo necessità per provare le cose. Non ho il libro a portata di mano, ma codifica interi come una lista di bit, in un modo strano che non riesco a ricordare: forse (1) rappresenta 0, (0) è illegale e l'MSB è l'ultimo della lista?

In ogni caso, è un sacco di lavoro; David Nolen ha anche recentemente introdotto qualcosa sui domini finiti in core.logic. Non so come funzionino, ma penso che semplifichi molto il problema permettendoti di specificare quali tipi di numeri considerare come una soluzione al tuo problema.

+0

ho trovato una pagina https://github.com/frenchy64/Logic-Starter/wiki/Aritmetica che lo attraversa – zcaudate

+0

Immagino che arithmatic non sia realmente il dominio per core.logic atm – zcaudate

2

core.logic nella sua forma attuale non è progettato come un risolutore di equazioni numeriche - è più appropriato per risolvere le espressioni logiche e relazionali.

Hai sostanzialmente due percorsi pratici per la risoluzione di equazioni matematiche:

  • risolutori analitici - Soluzioni si possono trovare abbastanza facilmente per i casi semplici per esempio equazioni quadratiche come quella che hai sopra, ma cominciano a diventare sempre più complesse abbastanza rapidamente e quindi diventano impossibili/non fattibili per molte equazioni. Questo è un enorme argomento di ricerca aperto.
  • Risolutori numerici - queste tecniche sono molto più generali e possono essere utilizzate praticamente su qualsiasi tipo di equazione. Tuttavia i risultati non sono esatti e gli algoritmi possono non trovare la giusta soluzione (s) se l'equazione ha caratteristiche "Nasty" (discontinuità, sfumature strane, insiemi complessi di minimi locali, ecc)

risolutori equazione richiedono intelligenza speciale per capire le "regole" delle equazioni matematiche, ad es come valutare le espressioni polinomiali (per soluzioni analitiche) o come stimare un derivato (per soluzioni numeriche).

Alcuni link che possono essere interessanti:

Problemi correlati