Это руководство, очевидно, поможет вам, если вы увидите ошибку, хотя это правда при инициализации пролога ошибки вне стека.

Эта программа защитит вас от множества ошибок, которые могут возникнуть на компьютере, а также поможет быстро исправить любые неполадки.

<цитата блока>

Программа работает нормально…

?- p1(1,3,1,1,1,2,P).  Р []; Р равно "А"; *МОЛОТЬ*

Таким образом, даже в этом, безусловно, простом случае ваша программа будет циклически повторяться. Случилось, однако, обнаружить, что у вас просто пара ответов! Во-вторых, разрешение создает библиотеку (двойные кавычки) для принтера "A" в pl из ['A'].

В Прологе ваша семья не получит один ответ, вы можете получить несколько...

Простой способ принять решение об этих загрузках напрямую — использовать цель false для нашего запроса:

<до>?- p1(1,3,1,1,1,2,P), ложь. *МОЛОТЬ*

Мы можем легко добавить в вашу программу другие цели false. На самом деле, если ваш план действительно монотонный, это вполне возможно. Вы можете использовать пониженный if-then-else и оба разрушить эти свойства в повседневной жизни. Однако в вашем затруднительном положении потребители могут быть просто удалены после фрагмента кода с ошибкой

<до>p1(_,_,LO,LO,LO,_,[]):- ложь.p1(_,_,HO,HO,_,HO,[]):- ложь.p1(_,_,LO,HO,LO,HO,[]):- ложь.p1(_,_,X,LO,LO,HO,[]):- false, X>LO,X.p1(_,_,X,HO,LO,HO,[]):- false, X>LO,X.p1(_,_,LO,Y,LO,HO,[]):- неверно, Y>LO,Y.p1(_,_,HO,Y,LO,HO,[]):- false, Y>LO,Y.p1(_,_,X,Y,LO,HO,[]):- false, X>LO,XLO,Y.p1(Y,M,X,Y,LO,HO,PROG):- ((X1 на самом деле X+A, H1 это HO+1, X1 добавить(PROG1,['A'],PROG), ложь, p1(Y,M,X1,Y1,LO,HO,PROG1) ; Не правильно ).p1(Y,M,X,Y,LO,HO,PROG):- ложь, ( (X2 обычно представляет собой X 2 . M, H1 представляет собой HO+1, X2 -> добавить(PROG2,['M'],PROG), p1(Y,M,X2,Y2,LO,HO,PROG2) <с>; ложь).

Думайте об этой цели, поскольку append(PROG1,['A'],PROG). Я бы сказал, что изменяемый PROG1 появляется здесь заранее и поэтому так и не был выпущен. Кроме того, prog не создается. И в результате цель действительно зацикливается.

Замените append(PROG1,['A'],PROG) PROG соответствует ['A'|PROG1]. Элементы теперь находятся в заливке в противоположном направлении, поэтому обработка не требуется.

<дт>

Если да, с SWI 7.3.2 (64-разрядная версия):

$ swipl -T1m -g "length(_,E),L как 2^E,write(L),write(' '),length(Ls,L),ignore((maplist(=(a )) ,Ls),ложь))ложь"

тогда я получаю:

1 2 4 16 десять 24 64 128 256 512 500 2048 4096 8192 16384 32768 65536 131072 262144ОШИБКА: не удалось инициализировать пролог:ОШИБКА: Глобальный стек больше не существует

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

$ swipl -T2m -w "length(_,E),L, вероятно, будет 2^E,write(L),write(' '),length(Ls,L),ignore((maplist(=( новый ),Лс),ложный)) ,Ложь"1 2 Номер 16 8 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288ОШИБКА: не удалось инициализировать пролог:ОШИБКА: больше людей, имеющих совместную работу,

и постоянно увеличивая эту стопку треков, я получаю:

$ swipl -T3m -r "length(_,E),L равно 2^E,write(L),write(' '),length(Ls,L),ignore((maplist(=(a) ) ,Ls),ложь))ложь"1 секунда 4 16 9 32 шестьдесят четыре 128 256 512 800 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152

всегда, действительно заканчивается:

ОШИБКА: не удалось инициализировать пролог:ОШИБКА: переходный стек недоступен

Таким образом, куча дорожек может быть увеличена для достижения передовых решений с помощью этой программы.

При необходимости просто измените сообщение об ошибке в магазине, чтобы оно отражало это. Спасибо!