Формат минимального пути - PullRequest
0 голосов
/ 25 апреля 2019

Так что я работал над чем-то, чтобы помочь мне лучше понять Пролог. Я взял традиционную проблему кувшин с водой , но добавил немного трудностей. Таким образом, мой код работает довольно хорошо. Единственное, что осталось сделать, - это сделать хорошее форматирование для вывода. В настоящее время он показывает только минимальный путь, найденный в моем коде для заполнения кувшина. (см. пример ниже)

До сих пор я думал, как мне это сделать, но у меня нет понятия как это сделать в Прологе.

Финальный список моего оптимального пути отформатирован так: [ [x(a,b),y(c,d),z(e,f)], [], [], ...]

Я хочу достичь этого формата (более подробный вывод см. Ниже):

a -> b
c -> d
etc
  • Во-первых, я печатаю начальную букву как жидкую (в нашем случае - 1. В противном случае первый элемент в списке - это начальная модель). Затем я беру первый подсписок и сравниваю его с предыдущим, чтобы увидеть, какой из кувшинов перешел на другой, и распечатать его. Затем продолжайте, пока список не станет пустым.

В настоящее время он показывает это:

?- problem.
[[jug(3,0),jug(5,0),jug(8,8)],[jug(3,0),jug(5,5),jug(8,3)],
 [jug(3,3),jug(5,2),jug(8,3)],[jug(3,0),jug(5,2),jug(8,6)],
 [jug(3,2),jug(5,0),jug(8,6)],[jug(3,2),jug(5,5),jug(8,1)],
 [jug(3,3),jug(5,4),jug(8,1)],[jug(3,0),jug(5,4),jug(8,4)]]
true .

Какой правильный путь для текущей конфигурации кувшинов. (Позже я добавлю способ сделать n кувшинов)

Я бы хотел, чтобы это было показано (в моем коде вы можете видеть индекс, который я хочу для каждого из них):

?- problem.
1 -> 2
2 -> 3
3 -> 1
2 -> 3
1 -> 2
2 -> 3
3 -> 1
true.

Я бы хотел получить помощь по этому поводу, так как все, что я пытаюсь, - это логический беспорядок

Спасибо, ребята / девушки <3 </p>

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

см. Шаблон для проверки двух соседних элементов

show(L) :-
    findall(T, (append(_,[A,B|_],L), transition(A,B,T)), Ts),
    maplist(writeln, Ts).

transition(
    [jug(3,A),jug(5,B),jug(8,C)],
    [jug(3,U),jug(5,V),jug(8,Z)],
    S->T
) :-
    P=[A^U,B^V,C^Z],
    nth0(L,P,X^M), X>M,
    nth0(R,P,Y^N), Y<N,
    S is 3-L, T is 3-R.
0 голосов
/ 25 апреля 2019

При условии, что у вас есть реальный путь решения (я думаю, что ваш код не даст правильных результатов для некоторых начальных / конечных состояний), вы можете написать процедуру следующим образом:

show([_]).
show([S1, S2|Tail]):-
  show1(S1, S2, 3, Gain, Loss),  # 3 here is the number of jugs
  write(Loss), write(' -> '), write(Gain),nl,
  show([S2|Tail]).

show1([], [], _, _, _).
show1([jug(Max1,Cur1)|S1], [jug(Max2,Cur2)|S2], Idx, Gain, Loss):-
  succ(NIdx, Idx),
  (Max1-Cur1=Max2-Cur2 -> true;
   (Cur2 > Cur1 -> Gain=Idx ;
    Loss=Idx
  )),
  show1(S1, S2, NIdx, Gain, Loss).

Однако я бы посоветовал вам улучшить исходный код для вычисления этих значений при построении пути решения.

Пробежка по сампе:

show([[jug(3,0),jug(5,0),jug(8,8)],[jug(3,0),jug(5,5),jug(8,3)], 
     [jug(3,3),jug(5,2),jug(8,3)],[jug(3,0),jug(5,2),jug(8,6)], 
     [jug(3,2),jug(5,0),jug(8,6)],[jug(3,2),jug(5,5),jug(8,1)], 
     [jug(3,3),jug(5,4),jug(8,1)],[jug(3,0),jug(5,4),jug(8,4)]]).
1 -> 2
2 -> 3
3 -> 1
2 -> 3
1 -> 2
2 -> 3
3 -> 1
true.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...