('B'e1)(e2) = (e1)(e2); (e1)('B'e2) = (e1)(e2); Лодка не будет приравниваться к людям; ее расположение является независимым измерением. Более хорошая идея - добавлять один символ ('L' или 'R') - для того, чтобы отмечать, находится ли лодка на левом или на правом берегу. Допустим, что вся компания приходит на левый берег реки. Тогда представлением начальной ситуации (состояния) служит:
L(e.Left-bank)(e.Right-bank) ЗАМЕЧАНИЕ: Для представления миссионеров и каннибалов были использованы символы (обратите внимание на кавычки), а для положения лодки - идентификаторы L и R . Это не имеет большого значения. Обычно программа выглядит лучше, если элементы, которые могут образовать предложение, представлены символами, в то время как символы, используемые отдельно, представлены идентификаторами.
Обратимся теперь ко множеству возможных перемещений. Перемещением является переплывание реки на лодке. Так как лодка может вместить не более двух человек и не может переплывать сама, то имеется пять возможных перемещений, которые будут представлены последовательными номерами в следующей таблице:
Перемещение
В лодку садятся:
1
два миссионера
2
два каннибала
3
миссионер и каннибал
4
миссионер
5
каннибал
Не все перемещения физически возможны в каждом состоянии. Например, если лодка находится на левом берегу и только один миссионер на этом берегу, тогда перемещение 1 невозможно. Но даже если перемещение возможно, следует проверить, является ли оно допустимым, т.е. не приводит ли к убийству. Так как перемещение является трансформацией текущего состояния, то оно определяется как: