2015-11-19 3 views
1

У меня есть эта программа пролога, которая на выходе выводит количество *, соответствующее размеру элементов списка.Как сделать вывод этой прологовой программы "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. 

Я не очень понимаю, пролог или понятие возвратов, что хорошо, так что это был, вероятно, плохо сформулированное объяснение и логика моего решения, скорее всего, не так, как хорошо. За это мне жаль.

Благодарим за помощь!

+0

Как @CapelliC указывает на короткое время в своем ответе, ваш покрой сделал бы то, что вы надеялись, но вам не хватает случай успеха базы для 'бл/1', а именно,' бл ([]). 'Без него, даже с разрезом,' bl/1' возвращается в пустой список ('[]'), а затем терпит неудачу, потому что 'bl ([]).' False. – lurker

ответ

1

вы можете добавить bl([]). или использовать список/2 и немного изменить свою программу, так как bl/1 это действительно просто предикат службы, необходимый для посещения списка.

s(N):-N>0,write(*),N1 is N-1,s(N1). 
s(N):-N=<0,nl. 

bl(L) :- maplist(s, L). 
Смежные вопросы