Как сгенерировать язык всех двоичных строк длиной n-1 с использованием DCG в Prolog

#prolog

#prolog

Вопрос:

 z(1) --> [].
z(N) --> [0] , z(Nm), {N is Nm 1}.
z(N) --> [1] , z(Nm), {N is Nm 1}. 
 

Это то, что у меня есть до сих пор. Я хочу сгенерировать

 [0,0]
[0,1]
[1,0]
[1,1]
 

но вместо этого запускается в бесконечный цикл после [0, 0]

когда вы запрашиваете

 ?- z(3, X, []).
 

Комментарии:

1. Почему вы удалили свой вопрос? Таким образом, никто даже не поймет ответ. Пожалуйста, учтите, что ответ не только для вас, но и может помочь другим. Вы должны иметь возможность прокомментировать свой собственный вопрос, где вы можете сказать «спасибо».

Ответ №1:

Если вы всегда будете вызывать предикат с N как целое число, вы можете попробовать:

 z(1) --> [].
z(N) --> [0] , {N>1, Nm is N-1}, z(Nm).
z(N) --> [1] , {N>1, Nm is N-1}, z(Nm).
 

Результат:

 ?- z(3, X, []).
X = [0, 0] ;
X = [0, 1] ;
X = [1, 0] ;
X = [1, 1] ;
false.
 

Комментарии:

1. Зачем тест integer(N) ? Это phrase(z(N), L) приводит к единому решению, а затем (тихо и неправильно) завершается неудачей.

2. @false Этот тест был устранен, спасибо!