There is already a solution for this on the ECLiPSe web site http://eclipseclp.org/examples/dmc_challenge_2019_sep.ecl.txt It does not solve by propagation alone either, probably for the reason you have discovered yourself. Regards, Joachim On 01/04/2020 10:34, Panagiotis Stamatopoulos wrote: > Thank you very much for your reply, Joachim! > > Actually, the origin of my question is a puzzle I was trying to solve: > https://alexis.lindaikejisblog.com/photos/shares/5d56b650ce177.jpg > > I wanted to stick to IC, as I intended to use it for a course I teach. > In addition, I wanted to get the answer just by propagation, without > any labeling, as the puzzle can be solved just by logical inferences. > Following your suggestion to use the reified form of #::, I ended with > the program that follows. Do you believe that there could be a better > solution, as far as readability is concerned (and advertisement of the > advantages of CLP)? Anyway, this program works fine. > Thank you very much, again. > > Takis > > ------------------------------------------------------------------------- > > :- lib(ic). > > code(X1, X2, X3) :- > [X1, X2, X3] #:: 0..9, > corcor(X1, X2, X3, 6, 8, 2, 1), > corwro(X1, X2, X3, 6, 1, 4, 1), > corwro(X1, X2, X3, 2, 0, 6, 2), > corcor(X1, X2, X3, 7, 3, 8, 0), > corwro(X1, X2, X3, 7, 3, 8, 0), > corwro(X1, X2, X3, 7, 8, 0, 1). > > /* corcor/7: N is the number of correct and well placed > * digits of code X1/X2/X3 compared to N1/N2/N3 */ > > corcor(X1, X2, X3, N1, N2, N3, N) :- > #::(X1, N1, B1), > #::(X2, N2, B2), > #::(X3, N3, B3), > N #= B1 + B2 + B3. > > /* corwro/7: N is the number of correct but wrongly placed > * digits of code X1/X2/X3 compared to N1/N2/N3 */ > > corwro(X1, X2, X3, N1, N2, N3, N) :- > #::(X1, [N2, N3], B1), > #::(X2, [N1, N3], B2), > #::(X3, [N1, N2], B3), > N #= B1 + B2 + B3. > > ------------------------------------------------------------------------- > > On 01-Apr-20 11:20 AM, Joachim Schimpf wrote: >> On 31/03/2020 19:22, Panagiotis Stamatopoulos wrote: >>> Hello All, >>> >>> I hope you are healthy and safe. May I ask a (maybe trivial) question >>> in the context of the IC library? Why the query >>> >>> ?- X #:: [1, 3], B #= (X #= 2). >>> X = X{[1, 3]} >>> B = B{[0, 1]} >>> There is 1 delayed goal. >>> >>> does not enforce Β to be equal to 0? >> >> >> IC's arithmetic equality and inequality constraints generally >> enforce bounds-consistency, that's why the hole in the domain >> of X is not taken into account. >> >> On could argue that for simple cases like X #= Y+Const stronger >> domain-consistency should be enforced, this is the reason for >> having http://eclipseclp.org/doc/bips/lib/ic/ac_eq-3.html . >> Unfortunately, a reified version of ac_eq/3 is missing! >> >> If, as in your example, the equation contains only one variable, >> you could use the reified form of #::, i.e. >> >> ?- X #:: [1, 3], #::(X, 2, B). >> X = X{[1, 3]} >> B = 0 >> >> >> By the way, lib(gfd) also does what you expect: >> >> ?- lib(gfd). >> >> ?- X #:: [1, 3], B #= (X #= 2). >> X = X{[1, 3]} >> B = 0 >> >> >> Cheers, >> JoachimReceived on Wed Apr 01 2020 - 16:25:19 CEST
This archive was generated by hypermail 2.3.0 : Wed Sep 25 2024 - 15:13:21 CEST