Пролог: вернуть список чисел от 0 до N с учетом N - PullRequest
0 голосов
/ 28 января 2019

Я изучаю Пролог, в частности, я сосредоточен на списке.

Если дано число n, вернуть список чисел от 0 до n.

Например, для 2 вывод будет [0,1,2]

Вот мой код:

num2list(0,[0]).
num2list(X,[H|T]) :- 
  H is X,
  N is X-1, 
  num2list(N,T).

вывод для num2list(2,X) равен X=[2,1,0].

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

Эта программа моя, и я не хочу использовать стандартные предикаты, такие как "in" или что-то, потому что я не знаю, и яхочу сделать чистую рекурсию.

Так что это простой способ сделать это?

Я вижу, как это сделано в книге, и я хочу сохранить это.

1 Ответ

0 голосов
/ 28 января 2019

Вы хотите список в порядке возрастания, но определение предиката строит его в порядке убывания.Существует более одного разумного решения этой проблемы, включая использование де-факто стандартных предикатов, таких как between/3.Решение, близкое к тому, которое вы пытаетесь использовать, заключается в использовании дополнительного аргумента:

num2list(N, List) :-
    num2list(0, N, List).

num2list(N, N, [N]).
num2list(N0, N, [N0| List]) :-
    N0 < N,
    N1 is N0 + 1,
    num2list(N1, N, List).

Пример вызова:

?- num2list(2, L).
L = [0, 1, 2] ;
false.

Проблема этого конкретного решения - ложная точка выборакак вы можете заметить на примере вызова.Эта проблема также присутствует в вашем коде.Это может быть легко решено с помощью менее декларативного решения с использованием конструкции cut или if-then-else.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...