kkck

# - - - P u z z l e . _ _ a s s u m e C h o i c e def __assumeChoice ( self, thisSlot, choice, nextSlot ): '''Generate solutions assuming thisSlot==choice [ (thisSlot is a slot in self) and (nextSlot is the successor of thisSlot) and (choice is a Word that is NOT a choice for thisSlot in self.__wordBank) and (all slots preceding thisSlot have a single choice) -> generate solutions to self assuming thisSlot==choice ] '''

This method calls the recursive solver (Section 44, “`Puzzle.__recurSolver()`

: Recursive
solver”) to generate any solutions
that result from assuming that `thisSlot`

should contain `choice`

. It assumes that the
caller has already removed `choice`

from `self.__wordBank`

's choices for `thisSlot`

.

If we assume that `choice`

is the right word
for `thisSlot`

, then we can remove that word
from all the other slots for which it is a choice.
However, we need to put that word back into the set of
choices for each of those other slots before returning.

kkck

#-- 1 -- # [ otherSlotList := slots in self for which self.__wordBank # shows (choice) as one of their choices ] otherSlotList = self.__wordBank.wordToSlots ( choice ) #-- 2 -- # [ self.__wordBank := self.__wordBank + (choice (choice) # for thisSlot) - (choice (choice) for all slots in # otherSlotList ] self.__wordBank.mayBe ( thisSlot, choice ) for otherSlot in otherSlotList: self.__wordBank.isNot ( otherSlot, choice ) #-- 3 -- # [ generate solutions assuming slots preceding nextSlot # are unchanged ] for solution in self.__recurSolver ( nextSlot ): yield solution #-- 4 -- # [ self.__wordBank := self.__wordBank - (choice (choice) # for thisSlot) + (choice (choice) for all slots in # otherSlotList ] for otherSlot in otherSlotList: self.__wordBank.mayBe ( otherSlot, choice ) self.__wordBank.isNot ( thisSlot, choice )