
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.85] |
![]() |
|
Сообщ.
#1
,
|
|
|
Всем доброго времени суток я недавно начал программировать в swi-prolog и столкнулся с трудностями с решением этой задачи.
Имеется два кувшина вместимостью 5 и 8 л, и необходимо отмерить 4 литра из бочки с водой (воды в бочке неограниченно много). Возможными операциями являются: 1) наполнение кувшина водой из бочки (кувшин наполняется полностью); 2) выливание содержимого кувшина в бочку; 3) переливание из одного кувшина в другой до полного опустошения первого, либо до полного заполнения второго. Указания к решению. Различные состояния этой задачи задаются информацией,сколько воды в первом кувшине и сколько во втором. Поэтому структура state(Объем_воды_в_первом_кувшине, Объем_воды_во_втором_кувшине) описывает состояние задачи. Начальное состояние state(0, 0), конечные состояния – state(_,4) или state(4,_). Требуется написать программу для решения это задачи (Два кувшина с водой. Поиск в глубину).Заранее спасибо! ![]() ![]() % Алгоритм поиска в глубину я смог найти solve(Start,Solve):- % Start - начальная вершина, Solve - искомый путь depth([],Start,Solve). depth(P,X,[X|P]):- goal(X). % этот предикат проверяет, % является ли вершина целевой depth(P,X,Solve):- next(X,X1), not(member(X1,P)), depth([X|P],X1,Solve). |
Сообщ.
#2
,
|
|
|
Твоя задача - реализовать предикат next(X,Y) где Х и У - валидные состояния, т.е. списки длиной 2. У тебя есть три варианта операций - наполнить, вылить, перелить. Наполнить - налить в левый 5 или в правый 8. Опустошить - запихать 0 в одно из состояний. Перелить - пиши условия, так как перелить можно только минимум из оставшегося свободным пространства в одном кувшине и количества воды во втором. "Налить" будет выглядеть примерно так:
![]() ![]() next([XL|XR],[5|XR]). next([XL|XR],[XL|8]). |