2014-11-24 1 views
3

저는 프롤로그를 처음 사용 했으므로 이와 같은 것을하고 싶지만 어디서부터 시작해야할지 모릅니다. 이미 행렬을 만들었고 숫자를 확인하는 방법은 Bounds 라이브러리에서 9 이하입니다.하지만 그 점에 대해서는 며칠 동안 고민하고 있습니다.프롤로그 - 매트릭스 방정식

은 다음과 같아야합니다

2+7-4=5 
+ - * 
9-5*2=8 
- + - 
4*3-8=4 
= = = 
7 5 0 

주요 아이디어는 그가 그것을 완료 할 수 있도록 프롤로그에게 반 작성 매트릭스를 제공하는 것입니다. 미리 알려 주시면 감사하겠습니다.

주어진 숫자와 연산자를 배치하여 방정식을 해결하기위한 코드 :

:- use_module(library(bounds)). 

lista([X]) --> [X]. 
lista([H|T]) --> [H], op, lista(T). 

op --> [+]. 
op --> [-]. 
op --> [*]. 
op --> [/]. 
op --> ['']. 

puzzle(Num, Res) :- 
    permutation(Num, Numbperm), 
    lista(Numbperm, Lista, []), 
    concat_atom([Res, =:=|Lista], At), 
    term_to_atom(Ev, At), 
    call(Ev), 
    write(Ev), nl. 
+2

이미 프롤로그 코드가 있습니까? 너 뭐 해봤 니? clp (fd)를 살펴보십시오 – vmg

+1

간단한 코드를 추가했습니다. @vmg –

+1

그리고 [둘러보기] (http://stackoverflow.com/tour)를 읽어 정보를 얻으십시오. – false

답변

2

을 활용하기 위해,이 library(clpfd))하지 library(bounds)를 사용하자!

 
m3x3_zs(Mss,Zs) :- 
    Mss = [[M11,M12,M13], [M21,M22,M23], [M31,M32,M33]], 
    Zs = [ M11,M12,M13 , M21,M22,M23 , M31,M32,M33 ], 

    Zs ins 0..9, 

    5 #= M11+M12-M13,    % row constraints 
    8 #= (M21-M22)*M23,   % (see text below for details) 
    4 #= M31*M32-M33, 

    7 #= M11+M21-M31,    % column constraints 
    5 #= M12-M22+M23, 
    0 #= M13*M23-M33. 

참고 강조 목표 8 #= <b>(M21-M22)*M23</b>을 위 :

:- use_module(library(clpfd)). 

우리는 다음과 같이 유지되어야하는 제약 조건을 명시 할 수 있습니다! A-B*C에 대한 공통 선행 규칙을 사용했다면 8 #= M21-(M22*M23)이되었지만 OP에서 제공 한 샘플 솔루션 [[2,7,4],[9,5,2],[4,3,8]]은 제외했을 것입니다.

이제 열거 형 술어 labeling/2을 사용하여 모든 솔루션을 검색해 보겠습니다!

 
?- m3x3_zs(Mss,Zs), labeling([],Zs). 
    Mss = [[0,5,0],[9,1,1],[2,2,0]], Zs = [0,5,0,9,1,1,2,2,0] 
; Mss = [[0,5,0],[9,8,8],[2,2,0]], Zs = [0,5,0,9,8,8,2,2,0] 
; Mss = [[0,7,2],[8,4,2],[1,8,4]], Zs = [0,7,2,8,4,2,1,8,4] 
; Mss = [[0,8,3],[9,5,2],[2,5,6]], Zs = [0,8,3,9,5,2,2,5,6] 
; Mss = [[1,4,0],[8,0,1],[2,2,0]], Zs = [1,4,0,8,0,1,2,2,0] 
; Mss = [[1,4,0],[8,7,8],[2,2,0]], Zs = [1,4,0,8,7,8,2,2,0] 
; Mss = [[1,5,1],[9,8,8],[3,4,8]], Zs = [1,5,1,9,8,8,3,4,8] 
; Mss = [[1,6,2],[7,3,2],[1,8,4]], Zs = [1,6,2,7,3,2,1,8,4] 
; Mss = [[1,7,3],[8,4,2],[2,5,6]], Zs = [1,7,3,8,4,2,2,5,6] 
; Mss = [[1,8,4],[9,5,2],[3,4,8]], Zs = [1,8,4,9,5,2,3,4,8] 
; Mss = [[2,3,0],[7,6,8],[2,2,0]], Zs = [2,3,0,7,6,8,2,2,0] 
; Mss = [[2,4,1],[8,7,8],[3,4,8]], Zs = [2,4,1,8,7,8,3,4,8] 
; Mss = [[2,5,2],[6,2,2],[1,8,4]], Zs = [2,5,2,6,2,2,1,8,4] 
; Mss = [[2,6,3],[7,3,2],[2,5,6]], Zs = [2,6,3,7,3,2,2,5,6] 
; Mss = [[2,7,4],[8,4,2],[3,4,8]], Zs = [2,7,4,8,4,2,3,4,8] 
; Mss = [[3,2,0],[6,5,8],[2,2,0]], Zs = [3,2,0,6,5,8,2,2,0] 
; Mss = [[3,3,1],[7,6,8],[3,4,8]], Zs = [3,3,1,7,6,8,3,4,8] 
; Mss = [[3,4,2],[5,1,2],[1,8,4]], Zs = [3,4,2,5,1,2,1,8,4] 
; Mss = [[3,5,3],[6,2,2],[2,5,6]], Zs = [3,5,3,6,2,2,2,5,6] 
; Mss = [[3,6,4],[7,3,2],[3,4,8]], Zs = [3,6,4,7,3,2,3,4,8] 
; Mss = [[4,1,0],[5,4,8],[2,2,0]], Zs = [4,1,0,5,4,8,2,2,0] 
; Mss = [[4,2,1],[6,5,8],[3,4,8]], Zs = [4,2,1,6,5,8,3,4,8] 
; Mss = [[4,3,2],[4,0,2],[1,8,4]], Zs = [4,3,2,4,0,2,1,8,4] 
; Mss = [[4,4,3],[5,1,2],[2,5,6]], Zs = [4,4,3,5,1,2,2,5,6] 
; Mss = [[4,5,4],[6,2,2],[3,4,8]], Zs = [4,5,4,6,2,2,3,4,8] 
; Mss = [[5,0,0],[4,3,8],[2,2,0]], Zs = [5,0,0,4,3,8,2,2,0] 
; Mss = [[5,1,1],[5,4,8],[3,4,8]], Zs = [5,1,1,5,4,8,3,4,8] 
; Mss = [[5,3,3],[4,0,2],[2,5,6]], Zs = [5,3,3,4,0,2,2,5,6] 
; Mss = [[5,4,4],[5,1,2],[3,4,8]], Zs = [5,4,4,5,1,2,3,4,8] 
; Mss = [[6,0,1],[4,3,8],[3,4,8]], Zs = [6,0,1,4,3,8,3,4,8] 
; Mss = [[6,3,4],[4,0,2],[3,4,8]], Zs = [6,3,4,4,0,2,3,4,8] 
; false. 

어떻게 좀 더 구체적으로 어떻습니까? 어떤 솔루션이 중간에 4을 가지고 있습니까?

 
?- m3x3_zs(Mss,Zs), Mss=[_,[_,4,_],_], labeling([],Zs). 
    Mss = [[0,7,2],[8,4,2],[1,8,4]], Zs = [0,7,2,8,4,2,1,8,4] 
; Mss = [[1,7,3],[8,4,2],[2,5,6]], Zs = [1,7,3,8,4,2,2,5,6] 
; Mss = [[2,7,4],[8,4,2],[3,4,8]], Zs = [2,7,4,8,4,2,3,4,8] 
; Mss = [[4,1,0],[5,4,8],[2,2,0]], Zs = [4,1,0,5,4,8,2,2,0] 
; Mss = [[5,1,1],[5,4,8],[3,4,8]], Zs = [5,1,1,5,4,8,3,4,8].