2014-04-09 7 views
5

मैं एक एसडब्ल्यूआई-प्रोलॉग प्रोग्राम संकलित करने की कोशिश कर रहा हूं लेकिन test is always true, var (sum) error on line 7 प्राप्त करना जारी रखता हूं। मैं समझ नहीं सकता कि इसका क्या अर्थ है। क्या कोई मदद कर सकता है? यह एक ऐसा कार्यक्रम है जिसे मैं आशा करता हूं कि आखिर में लैटिन वर्गों को हल किया जाएगा। धन्यवाद।प्रोलॉग परीक्षण हमेशा सत्य var (sum) त्रुटि

:- 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

यह एक चेतावनी है, न कि एक त्रुटि है।

मैंने कुछ बार फिर से इस समस्या के लिए एसडब्ल्यूआई-प्रोलॉग मेलिंग सूची पर एक अनुरोध पोस्ट किया, क्योंकि कुछ मौजूदा कोड संदेशों को परिशोधन के बाद इस चेतावनी को उठाना शुरू कर दिया। Here जनवरी

का उत्तर है, मुझे लगता है कि आप चेतावनी को अनदेखा कर सकते हैं, या इसे अक्षम कर सकते हैं, लेकिन ऐसा सलाह नहीं दी जाती है।

4

एक पंक्ति 1 और 3 के बीच तीन पूर्णांकों के होते हैं, और इन पूर्णांकों अंतर होना चाहिए, तो इस तरह के एक पंक्ति का योग (परिभाषा के द्वारा) 6 होना चाहिए। यह बताते हुए कि 6 जैसी पंक्ति की योग एक निष्क्रिय बाधा है। वही तर्क 'कॉलम' पर लागू होता है जिसके लिए आप समान विसंगति बाधाओं का दावा करते हैं।

संपादित करें: हालांकि उपर्युक्त तर्क सही है, यह चेतावनी की उत्पत्ति नहीं है। कार्लो इस पर सही है, यह बस उस तरीके पर निर्भर करता है जिस पर बाधा पुस्तकालय बाधाओं को फिर से लिखता है।

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 पर टिप्पणी करता हूं तो मुझे अभी भी वही त्रुटि मिलती है। (हो सकता है कि मैं इसे टिप्पणी करने के लिए नहीं हूं?) मैं ऑर्डर एन के लिए लैटिन वर्गों को हल करना चाहता हूं इसलिए मुझे यकीन नहीं है कि मेरी बाधाएं क्या होनी चाहिए। फिर से धन्यवाद – CompilerSaysNo

संबंधित मुद्दे