Основы построения и функционирования интеллектуальных информационных систем. Былкин В.Д - 137 стр.

UptoLike

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