ВУЗ:
Составители:
137
Текущее состояние сосудов описывается тройкой чисел, определяющих, сколько молока в
каждом. Учитывая это, запишем правило переливания на Прологе в следующем виде (предполагая,
что мы переливаем из первого сосуда во второй):
перелить (В_ первом, Во_ втором, В_ третьем ):-
объемы (Объем 1, Объем 2, Объем 3),
В_ первом > 0,
Свободно Объем 2— Во__ втором,
Свободно > 0,
минимум (В_ первом, Свободно, Количество),
Стало_в_первом is В_первом~Количество,
перелить (Стало_в_первом, Стало_во_втором, В_третьем).
Как видим, это правило есть не что иное, как переформулировка ранее словесно выраженного
правила на язык логического программирования. Затем следует сформулировать еще пять
полностью аналогичных правил переливания из первого сосуда в третий, из второго в первый и т. п.
Условие завершения этого процесса переливания мы сформулируем фактом
перелить(5, 5, 0).
Если при очередной попытке выполнения подцели «перелить» Пролог обнаружит, что в двух
первых сосудах стало ровно по 5 литров, вычисления закончатся. Переформулировка задачи с рус-
ского языка на язык Пролог закончена и как всегда вместе с этим закончено и построение
программы, решающей задачу. Введем теперь запрос
?- перелить (10, 0, 0).
В нем мы указываем начальное состояние сосудов: в первом "10 литров, в остальных - ничего.
Однако выполнение введенного запроса нам придется ждать очень долго, так как оно никогда не
закончится. Дело в том, что мы забыли сформулировать еще одно правило,
Если после некоторого переливания мы придем к состоянию, в котором сосуды уже однажды
были, то такое переливание делать не надо.
В нашем же случае в строгом соответствии с заданными правилами Пролог будет переливать
из первого сосуда во второй, затем
Текущее состояние сосудов описывается тройкой чисел, определяющих, сколько молока в
каждом. Учитывая это, запишем правило переливания на Прологе в следующем виде (предполагая,
что мы переливаем из первого сосуда во второй):
перелить (В_ первом, Во_ втором, В_ третьем ):-
объемы (Объем 1, Объем 2, Объем 3),
В_ первом > 0,
Свободно Объем 2— Во__ втором,
Свободно > 0,
минимум (В_ первом, Свободно, Количество),
Стало_в_первом is В_первом~Количество,
перелить (Стало_в_первом, Стало_во_втором, В_третьем).
Как видим, это правило есть не что иное, как переформулировка ранее словесно выраженного
правила на язык логического программирования. Затем следует сформулировать еще пять
полностью аналогичных правил переливания из первого сосуда в третий, из второго в первый и т. п.
Условие завершения этого процесса переливания мы сформулируем фактом
перелить(5, 5, 0).
Если при очередной попытке выполнения подцели «перелить» Пролог обнаружит, что в двух
первых сосудах стало ровно по 5 литров, вычисления закончатся. Переформулировка задачи с рус-
ского языка на язык Пролог закончена и как всегда вместе с этим закончено и построение
программы, решающей задачу. Введем теперь запрос
?- перелить (10, 0, 0).
В нем мы указываем начальное состояние сосудов: в первом "10 литров, в остальных - ничего.
Однако выполнение введенного запроса нам придется ждать очень долго, так как оно никогда не
закончится. Дело в том, что мы забыли сформулировать еще одно правило,
Если после некоторого переливания мы придем к состоянию, в котором сосуды уже однажды
были, то такое переливание делать не надо.
В нашем же случае в строгом соответствии с заданными правилами Пролог будет переливать
из первого сосуда во второй, затем
137
Страницы
- « первая
- ‹ предыдущая
- …
- 135
- 136
- 137
- 138
- 139
- …
- следующая ›
- последняя »
