The solver can solve sudoku puzzles (hopefully =)) but it should also be able to handle more general csp instances where the constraints are not symmetric. In the case of a sudoku puzzle, I think a single symmetric not-equal constraint would suffice.
n=: 81 d=: 9 ] C=: a: , < (i.d) ~:/ (i.d) ++-----------------+ ||0 1 1 1 1 1 1 1 1| ||1 0 1 1 1 1 1 1 1| ||1 1 0 1 1 1 1 1 1| ||1 1 1 0 1 1 1 1 1| ||1 1 1 1 0 1 1 1 1| ||1 1 1 1 1 0 1 1 1| ||1 1 1 1 1 1 0 1 1| ||1 1 1 1 1 1 1 0 1| ||1 1 1 1 1 1 1 1 0| ++-----------------+ A is a little bit beyond me to define at the moment. It would be an 81x81 matrix. For a variable x, it would be 1 for all variables on the same row, column and box as x and 0 otherwise. Side note: as you can see, not-equal is not a very strong constraint. Interleaving AC with search would probably be necessary to solve harder sudoku instances. Would changing: NB. a single constraint (note: constraints are not symmetric, for example x<y). to NB. a single constraint (note: constraints may be asymmetric, for example x<y). resolve the confusion? Mike On Sun, Nov 4, 2012 at 1:31 PM, Raul Miller <rauldmil...@gmail.com> wrote: > I think I am having a problem envisioning how a sudoku-style puzzle > can work with a relationship which is not commutative, and I am also > having a problem having to do with the transitive character of the > relationship. > > As you have put it: > > "(note: constraints are not symmetric, for example x<y)" > > I think I understand that in the general case we can have asymmetrical > relationships, but taking sudoku as an example... I believe I > understand "5 is not equal to any other value in the same row, in the > same column, or in the same square". But I am having a problem > understanding "5 is less than any other value in the same row, in the > same column, or in the same square" -- it seems to me that even if > that is true for 5, that it cannot be true for any other value in that > row, column, nor square. > > So obviously I'm missing something important here. I just do not know > what question to ask. > > Thanks, > > -- > Raul > > On Sun, Nov 4, 2012 at 3:54 PM, Michal D. <michal.dobrogost@I tgmail.com> > wrote: > > The adjacency matrix A is important because it tells us which constraint > to > > look up in C. This also explains why the lower diagonal is doubled. > > > > For example, take the less than constraint: > > > > c =: |: (i.n) </ (i.n) > > 2 2 $ '' ; 'Dx' ; 'Dy' ; c > > +--+-------+ > > | |Dx | > > +--+-------+ > > |Dy|0 0 0 0| > > | |1 0 0 0| > > | |1 1 0 0| > > | |1 1 1 0| > > +--+-------+ > > > > This constraint is useful for filtering Dx given Dy. Let's look at how > > revDom works (revDom is the heart of the algorithm). Let's generate a > > domain for x and y. > > > > Dx=: 1 1 1 1 NB. {0,1,2,3} > > Dy=: 1 1 1 0 NB. {0,1,2} > > > > To visualize, stick Dy on the left, and Dx on top: > > > > 2 2 $ '' ; Dx ; (|:,:Dy) ; c > > +-+-------+ > > | |1 1 1 1| > > +-+-------+ > > |1|0 0 0 0| > > |1|1 0 0 0| > > |1|1 1 0 0| > > |0|1 1 1 0| > > +-+-------+ > > > > Now we use Dy to select the relevant rows of c (each row represents the > set > > of values compatible with that value of Dy). > > > > Dy # c > > 0 0 0 0 > > 1 0 0 0 > > 1 1 0 0 > > > > Take the logical-or of these rows to compute the set of values of Dx that > > have some compatible value in Dy. > > > > +./ Dy # c > > 1 1 0 0 > > > > Finally, take the logical-and with Dx so we don't add values that weren't > > there in the first place. > > > > Dx *. +./ Dy # c > > 1 1 0 0 > > > > Now, with all this done, what if we want to filter Dy on Dx? We need to > > take the transpose of c. To prevent constant transposing, A and C store > > these for us. > > > > Mike > > > > On Sun, Nov 4, 2012 at 9:53 AM, Mike Day <mike_liz....@tiscali.co.uk> > wrote: > > > >> As far as I can understand the "revise" verb, you don't need the > >> adjacency matrix a, although it does help to have a 2-column matrix of > >> index pairs. > >> > >> I think Raul has overlooked your use of the right argument ys within > that > >> verb, though he's right about selecting with it. Here's a derivation of > >> arcs without explicit recourse to the adjacency matrix (I've just > noticed > >> that Raul presents a similar idiom): > >> > >> arcs=. ys (]#~ (e.~ {."1)) ($#: I.@,) *|:A > >> > >> I. returns a vector of indices to the ravelled boolean; $ #: turns them > >> into a matrix of pairs of indices to an array of the shape of |:A. > >> > >> (]#~ (e.~ {."1)) selects those arcs with an element of ys as the > from-node > >> (or perhaps they're the to-nodes?) > >> > >> This form renders the arcs array already sorted, but note that if you > do > >> need to sort the elements of an array, it's sufficient to use the idiom > >> /: ~ (rather than ({~ /:) . Presumably sorting "arcs" is > merely a > >> matter of taste. > >> > >> It's quite nice to be able to input several components of an argument by > >> (local) name with > >> 'A a C'=.x > >> 'ys D'=. y > >> rather than > >> A=. > 0{x > >> a=. > 1{x > >> ys=. > 0{y > >> D=. > 1{y > >> > >> As A is invariant in "ac", you could of course preset the array of > >> indices for all arcs in A, aix =: ($#: I.@,) *|:A and use aix as > an > >> input to "revise" instead of a . > >> > >> I used *|:A or (0<|:A) here and wonder why you need to double its lower > >> diagonal elements. > >> > >> I also wonder whether your example will still work if there are binary > >> constraints involving variables (say z and t) indexed with 2 or 3. And > >> what happens if there are more than one binary constraints on a pair of > >> variables? eg, X+Y=4 AND X>Y ? > >> > >> I'd have been very pleased with myself if I'd come up with code as good > as > >> this when I started J - would be pretty pleased if I managed it now! > >> > >> Mike > >> > >> > >> > >> On 04/11/2012 2:40 PM, Raul Miller wrote: > >> > >>> In > >>> A=. 0= ? (2$n)$2 NB. generate random matrix of [0,1] > >>> > >>> The 0= is unnecessary, and probably reflects a habit based on the > >>> false idea that boolean algebra is does not have an integer domain. > >>> Boolean rings have (subset of) integer domains, and [even after > >>> redefinition] boolean algebra is a boolean ring. > >>> > >>> If you ever want to treat Heyting Algebras or Bayesian Probability you > >>> might also want to consider what happens when you replace the $2 with > >>> $0. > >>> > >>> I think I would also be more comfortable with > >>> 2 2 $ ''; 'y'; 'x'; A > >>> for the displayed table, but that's a minor quibble. > >>> > >>> An alternative definition for adj might be > >>> adj=: <@I.@:* > >>> > >>> But somewhere around here, I get lost. Your use pattern for arcsX is: > >>> > >>> (i.n) arcsX A > >>> > >>> where A has the shape n,n > >>> > >>> What is the domain of the left argument of arcsX? I am guessing that > >>> it's either i.n or a single element choosen from i.n but if that is > >>> the case, I think I'd define arcsX to only work for the i.n case -- > >>> the name says "arcs" after all. Also, if I wanted to extract the > >>> values from the result of arcsX which correspond to a single value > >>> from i. n, that's simple enough -- I can select on the first column of > >>> the result. > >>> > >>> In other words, perhaps something like this: > >>> > >>> arcs=: $ #: I.@, > >>> arcs *A > >>> > >>> Also, I have not taken the time yet, to read "revise", so I will stop > >>> here. > >>> > >>> > >> > ------------------------------**------------------------------**---------- > >> For information about J forums see > http://www.jsoftware.com/**forums.htm<http://www.jsoftware.com/forums.htm> > >> > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm