The rule is somewhat overengineered. Let's look at it, blow by blow. ?cell <- (cell ... (row-number ?row-num)) ?cell2 <- (cell ... (row-number ?row-num2)) ; (test (= ?row-num ?row-num2)) You can simply use ?cell <- (cell ... (row-number ?row-num)) ?cell2 <- (cell ... (row-number ?row-num)) to ascertain equal row numbers.
?cell <- (cell ... (value nil) ...) ?cell2 <- (cell ... (value ?number&~nil) ...) This doesn't detect two equal values in two cells - it ascertains one cell being nil and another one not nil. Now this here: ?cell <- (cell ... (value ?number&~nil) (row-number ?row-num)) ?cell2 <- (cell ... (value ?number) (row-number ?row-num)) matches if we have a cell, and another one, with the same number, and the same row-number, BUT it also matches for any single cell with a value != nil. You can use the name to ensure they're different: ?cell <- (cell (name ?n) (value ?number&~nil) (row-number ?row-num)) ?cell2 <- (cell (name ?n2&~?n) (value ?number) (row-number ?row-num)) But this has the unpleasant effect to fire twice. But we can use the row fact to ensure two different cells in a row: ?row <- (row (cells $? ?cell1 $? ?cell2 $?)) ?cell1 <- (cell (value ?number&~nil)) ?cell2 <- (cell (value ?number)) That's about all you need, and it should work for any row. -W On 20/12/2013, northparkjamie <consumingja...@gmail.com> wrote: > My apologies for the lousy formatting of my original message. Please see > properly formatted version below. > > > northparkjamie wrote >> Hi, can you please help me? >> >> I'm relatively new to Jess (and using it with >> CTAT <http://ctat.pact.cs.cmu.edu/> >> , so my question may need to be redirected to them). >> >> I am trying to build a sudoku tutor (just to improve my skills) and I'm >> having a problem with my very first rule (below). This rule fires if one >> cell is empty and another in the same row is not. On the RHS, the predict >> function (from CTAT) checks whether the number entered by the user into >> the first cell is the same as the number in the second cell. If it is the >> same, the construct-message function displays the given message. If it is >> different, anything that has happened on the RHS is or remains undone. >> For >> example, if the row is {nil nil 6 nil nil nil 2 3 nil} and the user >> enters >> 6 in any of the nil cells, the rule should fire and the predict should >> match and the message should be shown. But, if the user enters 8, the >> rule >> should still fire, but the predict function should fail, so nothing >> should >> happen. >> >> If I test this rule on the first row of the 9x9 grid, it behaves as >> expected. But if I test it on any other row, the engine only tries it 20 >> times and never finds the cell in which the input was placed. >> >> Is there something in Jess that is limiting the number of trials or >> should >> I be talking to the CTAT people? If it is Jess, is there a way I can >> modify this limitation? >> >> Thanks in advance for your time and wisdom, >> Jamie >> >> (defrule bug-num-is-in-row >> ?prob <- (problem >> (interface-elements $? >> ?grid $?)) >> ?grid <- (grid (rows $? ?row $?)) >> ?row <- (row (cells $? ?cell $?)) >> ?cell <- (cell >> (name ?name) >> (value nil) >> (row-number ?row-num)) >> ?cell2 <- (cell >> (value ?number&~nil) >> (row-number ?row-num2)) >> (test (= ?row-num ?row-num2)) >> => >> (predict ?name UpdateTextField ?number) >> (construct-message >> "[The row already has a >> "?number".]") >> ) > > > > > > -- > View this message in context: > http://jess.2305737.n4.nabble.com/Limit-on-number-of-rules-tried-tp4654204p4654205.html > Sent from the Jess mailing list archive at Nabble.com. -------------------------------------------------------------------- To unsubscribe, send the words 'unsubscribe jess-users y...@address.com' in the BODY of a message to majord...@sandia.gov, NOT to the list (use your own address!) List problems? Notify owner-jess-us...@sandia.gov. --------------------------------------------------------------------