Программа работает хорошо, но ...
В самом деле? Давайте попробуем минимальный случай:
?- p1(1,3,1,1,1,2,P).
P = []
; P = "A"
; *LOOPS*
То есть даже в этом очень простом случае ваша программа зацикливается. Однако оказалось, что нашли два ответа! Второй ответ использует library(double_quotes)
для печати "A"
вместо ['A']
.
В Прологе вы не получаете только один ответ, вы можете получить несколько из них ...
Простой способ непосредственно выявить такие проблемы, не связанные с терминацией, - добавить цель false
к вашему запросу:
?- p1(1,3,1,1,1,2,P), <b>false</b>.
*LOOPS*
Мы можем добавить еще такие цели false
в вашу программу. Строго говоря, это возможно только в том случае, если ваша программа является чисто монотонной. Вы используете cut и if-then-else, которые уничтожают такие свойства в общем случае. Однако в вашем случае их можно просто отбросить в следующем fault-slice
<s>p1(_,_,LO,LO,LO,_,[]) :- <b>false</b></s>.
<s>p1(_,_,HO,HO,_,HO,[]) :- <b>false</b></s>.
<s>p1(_,_,LO,HO,LO,HO,[]) :- <b>false</b></s>.
<s>p1(_,_,X,LO,LO,HO,[]) :- <b>false</b>, X>LO,X<HO</s>.
<s>p1(_,_,X,HO,LO,HO,[]) :- <b>false</b>, X>LO,X<HO</s>.
<s>p1(_,_,LO,Y,LO,HO,[]) :- <b>false</b>, Y>LO,Y<HO</s>.
<s>p1(_,_,HO,Y,LO,HO,[]) :- <b>false</b>, Y>LO,Y<HO</s>.
<s>p1(_,_,X,Y,LO,HO,[]) :- <b>false</b>, X>LO,X<HO,Y>LO,Y<HO</s>.
p1(A,M,X,Y,LO,HO,PROG) :-
( (X1 is X+A, H1 is HO+1, X1<H1, Y1 is Y+A, Y1<H1 )
-> append(PROG1,['A'],PROG), <b>false</b>,
<s>p1(A,M,X1,Y1,LO,HO,PROG1)</s>
; false ).
<s>p1(A,M,X,Y,LO,HO,PROG) :- <b>false</b></s>,
<s>( (X2 is X * M, H1 is HO+1, X2<H1, Y2 is Y * M, Y2<H1)</s>
<s>-> append(PROG2,['M'],PROG)</s>,
<s>p1(A,M,X2,Y2,LO,HO,PROG2)</s>
<s>; false )</s>.
Считайте эту цель append(PROG1,['A'],PROG)
. Переменная PROG1
встречается здесь впервые и, следовательно, никогда не создается. Также PROG
не создается. И, таким образом, эта цель будет повторяться.
Заменить append(PROG1,['A'],PROG)
на PROG = ['A'|PROG1]
. Теперь элементы располагаются в противоположном направлении, и, таким образом, обратное движение не требуется.
Запрос mama_mia1(70000,17,2,5,89000,89900,P)
теперь просто не выполняется, как false
.