2012-09-25 3 views
8

내가 core.logic에 쿼리를 입력 시도 :core.logic

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

그리고 프롬프트는 말한다, 내가하지 않은 경우에

error: lvar cannot be cast to a number 

완전히 논리 프로그래밍에 대해 잘못 이해하고 있습니다.이 문제는 core.logic을 사용하여 해결할 수있는 방법이 있습니까?

답변

5

지금까지 core.logic이 방정식을 풀기 위해 대수학을 할 수 없다는 것을 알았습니다.

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

작품 x는 명확한 값을 가지고 있으며, x가없는 경우 실패 할 때 : 그 수학에 대한 입력이 수학 함수는 다음에서 작동 할 수 없기 때문에하지 LVar의 실제 값을해야하지만 그것은 기본적인 수학을 할 수 :

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

아이디어를 얻으려면 Reasoned Schemer를 읽어야합니다. 기본적으로 논리 프로그램에서 수학을 수행하는 방법은 목록 기반의 숫자 인코딩을 생성하는 것입니다. 논리 엔진은 필요한만큼 키울 수 있으므로 문제를 해결할 수 있습니다. 나는이 책을 편리하게 가지고 있지는 않지만 정수를 비트 목록으로 인코딩한다. 다소 이상한 방식으로 나는 아마도 기억할 수 없다. 어쩌면 (1)은 0을 나타내고, (0)은 불법이며, MSB는 목록에 마지막인가?

어쨌든, 그것은 많은 작업입니다. David Nolen은 최근 core.logic에 유한 도메인에 대해 소개했습니다. 어떻게 작동하는지 모르지만 문제의 해결 방법으로 고려해야 할 숫자의 종류를 지정하여 문제를 간단하게 처리 할 수 ​​있다고 생각합니다.

+0

내가 페이지를 발견 https://github.com/frenchy64/Logic-Starter/wiki/그것을 통해가는 산술 – zcaudate

+0

아마 arithmatic는 core.logic atm의 도메인이 아니라고 생각합니다. – zcaudate

2

core.logic의 형식은 수치 방정식 해석기로 설계되지 않았으므로 논리식 및 관계식을 해결하는 것이 더 적절합니다. 당신은 기본적으로 수학 방정식을 해결하기위한 두 개의 실제 경로가

:

  • 분석 해법 - 솔루션을 예를 들어, 간단한 경우에 아주 쉽게 찾을 수 있습니다 위와 같은 이차 방정식을 사용하지만 점점 더 복잡해지기 시작하고 많은 방정식에서는 불가능하거나 불가능합니다. 이것은 거대한 공개 연구 주제입니다.
  • 수치 해석기 - 이러한 기법은 훨씬 더 일반적이고 거의 모든 종류의 방정식에 사용할 수 있습니다. 그러나 방정식에 "불쾌한"특징 (불연속성, 홀수 그라디언트, 로컬 미니 마의 복잡한 세트 등)이있는 경우 결과가 정확하지 않고 알고리즘이 올바른 솔루션을 찾지 못할 수 있습니다.

수식 해결사는 수학 방정식의 "규칙"을 이해하는 특수 인텔리전스 (분석 솔루션 용) 다항식 표현 방법 또는 파생 솔루션 추정 방법 (수치 솔루션 용).흥미로운 일이 될 수 있습니다

일부 링크 :