Прога для Swi-Prolog:
start([d0, d1]).
correct([Bank0, Raft, Bank1]) :- start(Start), append(Bank0, Raft, Temp), append(Temp, Bank1, Start).
После выдачи 6 ответов пролог зависает. Объясните, пожалуйста, почему и как исправить?
Программировать сложно. Но не программировать еще сложнее.
Здравствуйте, DSblizzard, Вы писали:
DS>После выдачи 6 ответов пролог зависает. Объясните, пожалуйста, почему и как исправить?
Для краткости, назовём три части списка A,B,C
append(A,B,T), append(T,C,[0,1])
Поехали трассировать!
append(A,B,T) : A=[],B=[],T=[]
append([],C,[0,1]) : C=[0,1]
откатываемся для перебора...
append(A,B,T) : T=[T0], A=[T0],B=[] — допустим, что T состоит из неизвестного нам элемента...
append([T0],C,[0,1]) : T0=0,C=[1] — откуда следует, что A=[0]
откатываемся для перебора...
append(A,B,T) : T=[T0], A=[],B=[T0];
ну и так далее:
T=[T0,T1], A=[T0,T1],B=[] — допустим, что там два неизвестных элемента...
T=[T0,T1], A=[T0],B=[T1]
T=[T0,T1], A=[],B=[T0,T1]
и тут, пришла пора сделать следующее предположение:
T=[T0,T1,T2]!!!
Естественно, решений не будет найдено, все три варианта будут отвергнуты, и мы перейдём дальше
T=[T0,T1,T2,T3]
Очевиден способ исправиться
correct(Start,A,B,C) :- append(T,C,Start), append(A,B,T).
То есть, просто переставить два уравнения местами.
Отсюда, кстати, видно, что от порядка уравнений сумма меняется
![](/Forum/Images/smile.gif)
Какие-то решения могут стать недостижимыми, а какие-то приводить к зацикливанию.
И тебе ещё повезло, что append перебирает слагаемые по сумме. А если бы он начал с перебора слагаемых?
A=[],B=[], --> T=[]
A=[A0],B=[], --> T=[A0]
A=[A0,A1],B=[] --> T=[A0,A1]
A=[A0,A1,A2],B=[] --> T=[A0,A1,A2], ну дальше понятно