[Пролог] Пролог виснет на простой программе.
От: DSblizzard Россия  
Дата: 29.11.09 11:03
Оценка:
Прога для Swi-Prolog:

start([d0, d1]).
correct([Bank0, Raft, Bank1]) :- start(Start), append(Bank0, Raft, Temp), append(Temp, Bank1, Start).


После выдачи 6 ответов пролог зависает. Объясните, пожалуйста, почему и как исправить?
Программировать сложно. Но не программировать еще сложнее.
Re: [Пролог] Пролог виснет на простой программе.
От: Кодт Россия  
Дата: 29.11.09 19:23
Оценка: 2 (1)
Здравствуйте, 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).

То есть, просто переставить два уравнения местами.

Отсюда, кстати, видно, что от порядка уравнений сумма меняется Какие-то решения могут стать недостижимыми, а какие-то приводить к зацикливанию.
И тебе ещё повезло, что 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], ну дальше понятно
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.