Учитывая (несколько) недавнее добавление библиотеки ( solution_sequence ) и, в частности, call_nth / 2, сегодня вы можете написать
?- call_nth((between(1,4,X), writeln(X)), 100).
1
2
3
4
false.
конечно, когда интересуются только первые 100 ответов. Немного контроля:
?- call_nth((between(1,4,X), writeln(X)), 2).
1
2
X = 2.
До вызова call_nth / 2 я использовал forall / 2:
?- forall(between(1,4,X), writeln(X)).
1
2
3
4
true.
редактировать
учитывая, что call_nth и forall являются двоичными предикатами, немного синтаксического сахара может немного сократить REPL: в ~ / .swiplrc add
:- op(100, xfx, (?*)).
Gen ?* Test :- forall(Gen, Test).
:- op(1100, xfx, (?+)).
Run ?+ Count :- call_nth(Run, Count).
затем перезапустите swipl, и теперь
?- between(1,4,X) ?* (S is X*X, writeln(square_of(X):S)).
square_of(1):1
square_of(2):4
square_of(3):9
square_of(4):16
true.
?- between(1,4,X), write(X), nl ?+ 2.
1
2
X = 2.
Обратите внимание на различные приоритеты (100 против 1100) и влияние на мини DSL.
редактировать
Расширение uDSL с помощью красивого шаблона WillNess:
:- op(1100, fx, (*)).
(* Goal) :- (Goal, false ; true).
, а затем
?- * between(1,3,N), write(N), nl.
1
2
3
true.