44
3. Поиск на основе логики
В разд. 2.1 мы рассматривали решение задачи о волке, козе и капусте
методом поиска в пространстве состояний. Между тем, в литературе эта задача
называется логической. Следовательно, ее решение должно быть получено
путем умозаключений. Попробуем применить пропозиционную логику (булеву
логику) для нахождения решения.
Обозначим состояния волка, козы, капусты и фермера переменными W, G,
C и F
соответственно и присвоим им значения «истина» или логическая
единица, если они находятся на левом берегу, и «ложь» или 0, если на правом.
Тогда стартовое состояние будет W=1, G=1, C=1, F=1, а конечное – W=0, G=0,
C=0, F=0. Запрещенными состояниями будут следущие:
WG¬F – волк и коза на левом берегу, фермер – на правом;
GС¬F – коза и капуста на левом берегу, фермер – на
правом;
¬W¬GF – волк и коза на правом берегу, фермер – на левом;
¬W¬GF – коза капуста на правом берегу, фермер – на левом.
Для решения этой задачи нужны входные и выходные переменные.
Обозначим W1, G1, C1 и F1 в качестве выходных переменных. Решение задачи
в логике первого порядка должно выглядеть следующим образом:
f(W,G,C,F) => (W1,G1,C1,F1) = (0,0,0,0).
К сожалению, эта задача не решается
за один шаг, поэтому решение будет
заключаться в последовательности преобразований переменных W,G,C,F в
W1,G1,C1,F1.
При перемещении с левого на правый берег не должны быть истинными
выражения W1G1 или G1C1.
(F & W & ¬G¬C) => (F1 = 0, W = 0, G1=G, C1=C) – фермер везет волка;
(F & G) => (F1 = 0, W1 = W, G1=0, C1=C) – фермер везет козу.
Конфликта быть не может в принципе, так как волк не ест капусту;
(F & С & ¬W¬G) => (F1 = 0, C1 = 0, W1=W, G1=G) – фермер везет
капусту.
Попробуем
теперь выразить в виде булевой функции условие перемещения
фермера с правого берега на левый без груза. Это возможно в том случае, если
фермер находится на правом берегу (¬F), и с его уходом оттуда волк не съест
козу (¬W¬G), а коза – капусту (¬G¬C):
( ¬F & ¬W¬G & ¬G¬C ) => (W1 = W, G1 = G, C1 = C, F1 = ¬F).
Таким же образом можно написать булевы функции для разрешения
конфликтов
на правом берегу. Объединив все эти импликации с помощью
дизъюнкции, получим универсальную функцию для одного шага решения этой
задачи, правда, без устранения повторяющихся состояний.
Заметим, что написание этих функций представляет собой весьма
кропотливую работу, причем для другой задачи эти функции должны быть
написаны заново. Формализация решения подобных задач может быть
достигнута использованием таблиц истинности. Выпишем все возможные
комбинации переменных: