У меня есть эта программа пролога, которая на выходе выводит количество *, соответствующее размеру элементов списка.Как сделать вывод этой прологовой программы "true"?
bl([N|L]):-s(N),nl,bl(L).
s(N):-N>0,write(*),N1 is N-1,s(N1).
s(N):-N=<0.
Например, для запроса bl([1,1,2,6,24]).
программа выводит:
1 ?- bl([1,1,2,6,24]).
*
*
**
******
************************
false.
Моя задача состоит в том, чтобы сделать программу дать «истинный» в качестве окончательного ответа. Если я прав, он дает false, потому что когда он заканчивает вызов и печать * для последнего элемента 24, пролог пытается сопоставить хвост bl ([]), который теперь является пустым списком и начинает обратный путь. Поэтому я попытался поставить разрез после nl
, но это тоже не сработало. Любые идеи, почему, или как сделать это выдающимся?
bl([N|L]):-s(N),nl,!,bl(L).
s(N):-N>0,write(*),N1 is N-1,s(N1).
s(N):-N=<0.
Я не очень понимаю, пролог или понятие возвратов, что хорошо, так что это был, вероятно, плохо сформулированное объяснение и логика моего решения, скорее всего, не так, как хорошо. За это мне жаль.
Благодарим за помощь!
Как @CapelliC указывает на короткое время в своем ответе, ваш покрой сделал бы то, что вы надеялись, но вам не хватает случай успеха базы для 'бл/1', а именно,' бл ([]). 'Без него, даже с разрезом,' bl/1' возвращается в пустой список ('[]'), а затем терпит неудачу, потому что 'bl ([]).' False. – lurker