2016-05-18 8 views
2

ich eine einfache Einschränkung über alle Werte einer Liste tun wollen, möchte ich jeden Index jeder Zeile eines Arrays die folgende (ic) Zwang haben:einfache Arithmetik Constraint auf Liste ECLIPSE clp

500 # = 2^X1 + 2^X2 + 2^X3 + ... + 2^X9

Ich versuche, den folgenden Code zu tun. Array ist eine 9x9-Matrix und für jede Zeile soll die obige Bedingung erfüllt sein. Dies scheint jedoch nicht zu funktionieren, das Programm findet keine möglichen Werte, die die Einschränkung erfüllen.

model(Array) :- 
Array :: 1..9, 
(for(I,1,9), param(Array) 
do 
     X1 is Array[I,1], 
     X2 is Array(I,2], 
     X3 is Array[I,3], 
     X4 is Array[I,4], 
     X5 is Array[I,5], 
     X6 is Array[I,6], 
     X7 is Array[I,7], 
     X8 is Array[I,8], 
     X9 is Array[I,9], 
     500 #= 2^X1 + 2^X2 + 2^X3 + 2^X4 + 2^X5 + 2x^X6 + 2^X7 + 2^X8 + 2^X9 

), 
term_variables(Array,L), 
labeling(L), 
printBoard(Array). 

Antwort

2

Dies scheint ein Fehler in der Implementierung von Integer-Einschränkungen die Potenzierung Ausdrücke zu sein. Da Ihre Variablen sowieso alle integral sind, können Sie die #= durch $= ersetzen und es wird funktionieren (die Constraints sollen Integrity auf den Variablen auferlegen, während die $ Constraints dies nicht tun).

By the way, können Sie Ihren Code auf diese Weise verkürzen:

..., 
    (foreacharg(Row,Array) do 
     (foreacharg(X,Row), foreach(2^X,Powers) do true), 
     500 $= sum(Powers) 
    ), 
    ...