Как напечатать числа от 1 до 100 в прологе? - PullRequest
5 голосов
/ 28 ноября 2011

Следующий код является кодом Пролога, который дает все целые числа больше 0. Каждый раз, когда я помещаю ; в интерпретатор, он дает следующее число:

is_integer(0).
is_integer(X) :- is_integer(Y),X is Y+1.

Есть ли способ, где он дает числа только от 0 до 100. Когда он достигнет 100, он должен остановиться.

Ответы [ 2 ]

5 голосов
/ 28 ноября 2011

Для этого есть встроенный предикат between/3 в B, Ciao, SICStus (библиотека), SWI, YAP, XSB (библиотека).

?- between(0,100,X).
X = 0 ;
X = 1 ;
...
X = 100.

Если вы начинаете изучать пролог, лучше сначала попытайтесь использовать числа s(X), которые гораздо легче понять и обдумать. Тот же пример, но только до 3:

?- nat_nat_sum(N,_,s(s(s(0)))).

с определением:

nat_nat_sum(0,I,I).
nat_nat_sum(s(I),J,s(K)) :-
   nat_nat_sum(I,J,K).
2 голосов
/ 28 ноября 2011

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

is_integer(0).
is_integer(X) :-
    is_integer(Y),
    ( Y >= 100, ! ; X is Y + 1 ).

Здесь вывод трассы, ограничивающий диапазон 3 (т.е. ... Y >= 3, ! ; ...)

?- is_integer(X).
X = 0 ;
X = 1 ;
X = 2 ;
X = 3 ;
true.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...