# - - - 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.
#-- 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 )