2014-04-09 2 views
5

SWI-Prolog 프로그램을 컴파일하려고하지만 계속 test is always true, var (sum) error on line 7이됩니다. 나는 이것이 무엇을 의미하는지 파악할 수 없다. 누군가 도와 주실 수 있습니까? 이것은 궁극적으로 라틴어 사각형을 해결하기를 희망하는 프로그램입니다. 고맙습니다. 행이 13 세 사이의 정수로 구성되며, 이들 정수는 구별되어야하는 경우프롤로그 테스트는 항상 true입니다. var (합계) 오류

:- use_module(library(clpfd)). 

magic_counter(Count) :- 
    findall(a, magic_1(_Soln), As), 
    length(As, Count). 

magic_1(Soln) :- 
    Row1 = [W1, W2, W3], 
    Row2 = [X1, X2, X3], 
    Row3 = [Y1, Y2, Y3], 

    Row1 ins 1..3, 
    Row2 ins 1..3, 
    Row3 ins 1..3, 

    Sum #= 6, 

    all_different(Row1), 
    all_different(Row2), 
    all_different(Row3), 

    all_different([W1,X1,Y1]), 
    all_different([W2,X2,Y2]), 
    all_different([W3,X3,Y3]), 

    W1 + W2 + W3 #= Sum, 
    X1 + X2 + X3 #= Sum, 
    Y1 + Y2 + Y3 #= Sum, 

    W1 + X1 + Y1 #= Sum, 
    W2 + X2 + Y2 #= Sum, 
    W3 + X3 + Y3 #= Sum, 

    append(Row1,Row2,Row12), 
    append(Row12,Row3,Soln), 

    labeling([], Soln). 

답변

4

그것은 경고가 아닌 오류입니다.

나는이 문제에 대한 SWI-Prolog 메일 링리스트에 대한 요청을 다시 올렸습니다. 기존의 코드 중 일부는 메시지를 수정 한 후에이 경고를 내기 시작했기 때문입니다. Here은 1 월 1 일의 답변입니다.

경고를 무시하거나 사용 중지 할 수 있다고 생각하지만 권장하지 않는 것 같습니다.

4

, 그러한 행의 합은 (정의에 의해) 6이어야한다. 그러한 행의 합이 6과 같다고 말하면 유휴 제약 조건입니다. 유사한 추론 제약 조건을 주장하는 '열'에도 동일한 추론이 적용됩니다.

편집 : 위의 추측이 정확하더라도이 내용은 경고의 출처가 아닙니다. Carlo는 바로 이것입니다. 제약 라이브러리가 제약을 다시 작성하는 방식에 따라 달라집니다.

test1:- 
    L = [X], 
    L ins 1..2, 
    Y #= 2, 
    X #= Y. 

test2:- 
    L = [X], 
    L ins 1..2, 
    X #= 2. 

test1/0

가 경고를 제공, test2/0하지 않습니다. 그러나 나는 왜 경고가 처음에 주어 졌는지, 즉 그것 뒤에 합리적인 것이 무엇인지 알기가 어렵다. 예를 들어, 다음 test1/0의 확장은 (내 의견을 통지)입니다 :

:- use_module(library(clpfd)). 

test1:- 
    A=[D], 
    A ins 1..2, 
    (
    integer(B) 
    -> 
    (
     var(2) 
    -> 
     2 is B 
    ; 
     true 
    -> 
     B=:=2 
    ; 
     C is B, 
     clpfd:clpfd_equal(C, 2) 
    ) 
    ; 
    true 
    -> 
    (
     var(B) % This does not throw a warning. 
    -> 
     B is 2 
    ; 
     C is 2, 
     clpfd:clpfd_equal(B, C) 
    ) 
    ; 
    clpfd:clpfd_equal(B, 2) 
), 
    (
    integer(D) 
    -> 
    (
     var(B) % This throws a "Test is always true" warning. 
    -> 
     B is D 
    ; 
     integer(B) 
    -> 
     D=:=B 
    ; 
     E is D, 
     clpfd:clpfd_equal(E, B) 
    ) 
    ; 
    integer(B) 
    -> 
    (
     var(D) 
    -> 
     D is B 
    ; 
     E is B, 
     clpfd:clpfd_equal(D, E) 
    ) 
    ; 
    clpfd:clpfd_equal(D, B) 
). 
+0

안녕하십니까. 나는 프롤로그에 아주 새롭다. Sum # = 6을 주석 처리하면 여전히 동일한 오류가 발생합니다. (어쩌면 내가 그것을 언급하는 의미가 아니에요?) 난 주문 n에 대한 라틴 사각형을 해결하고 싶습니다 그래서 내 제약이 있어야할지 모르겠다. 다시 감사합니다 – CompilerSaysNo