# - - - 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, “
solver”) to generate any solutions
that result from assuming that
choice. It assumes that the
caller has already removed
self.__wordBank's choices for
If we assume that
choice is the right word
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.
#-- 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 )