На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Задача два кувшина с водой. Поиск в глубину в swi-prolog. , Пролог,swi-prolog
    Всем доброго времени суток я недавно начал программировать в swi-prolog и столкнулся с трудностями с решением этой задачи.

    Имеется два кувшина вместимостью 5 и 8 л, и необходимо отмерить 4 литра из
    бочки с водой (воды в бочке неограниченно много). Возможными операциями являются:
    1) наполнение кувшина водой из бочки (кувшин наполняется полностью);
    2) выливание
    содержимого кувшина в бочку;
    3) переливание из одного кувшина в другой до полного опустошения первого, либо до полного заполнения второго.
    Указания к решению. Различные состояния этой задачи задаются информацией,сколько воды в первом кувшине и сколько во втором. Поэтому структура state(Объем_воды_в_первом_кувшине, Объем_воды_во_втором_кувшине) описывает состояние задачи. Начальное состояние state(0, 0), конечные состояния – state(_,4) или state(4,_).

    Требуется написать программу для решения это задачи (Два кувшина с водой. Поиск в глубину).Заранее спасибо!

    ExpandedWrap disabled
      % Алгоритм поиска в глубину я смог найти
      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).
      Твоя задача - реализовать предикат next(X,Y) где Х и У - валидные состояния, т.е. списки длиной 2. У тебя есть три варианта операций - наполнить, вылить, перелить. Наполнить - налить в левый 5 или в правый 8. Опустошить - запихать 0 в одно из состояний. Перелить - пиши условия, так как перелить можно только минимум из оставшегося свободным пространства в одном кувшине и количества воды во втором. "Налить" будет выглядеть примерно так:
      ExpandedWrap disabled
        next([XL|XR],[5|XR]).
        next([XL|XR],[XL|8]).
      Остальное пробуй писать сам.
        https://www.cyberforum.ru/prolog/thread880000.html
        Сообщение отредактировано: Betelgeuse -
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0193 ]   [ 15 queries used ]   [ Generated: 19.03.24, 02:56 GMT ]