Я хочу сделать программу, в которой пользователь будет давать отрицательное число, и он будет возвращать список, начиная с нуля до этого числа. Вот желаемый выходной пример create (-5, L). L = [0, -1, -2, -3, -4, -5]

Не могли бы вы помочь мне, пожалуйста?

1
kindaExcited 8 Сен 2017 в 19:42

3 ответа

Лучший ответ

Поскольку вы предоставили свой код (который, как упоминалось в комментариях, было бы лучше отобразить в вашем вопросе), я думаю, что одной из проблем является то, что в случаях X>0 и X<0 предложений у вас будет бесконечная рекурсия, может быть было бы лучше использовать abs/1:

create(0,[0]).
create(X,[X|T]):- Y is abs(X), Y > 0,
                  (X>0 -> N is X-1 ; N is X+1),
                  create(N,T).

Хотя еще одна проблема:

?- create(-5,L).
L = [-5, -4, -3, -2, -1, 0] ;
false.

?- create(5,L).
L = [5, 4, 3, 2, 1, 0] ;
false.

Список построен в обратном порядке, так что вы можете изменить его в конце, например:

create_list(N,L):- create(N,L1), reverse(L1, L).

И сейчас:

?- create_list(5,L).
L = [0, 1, 2, 3, 4, 5] ;
false.

?- create_list(-5,L).
L = [0, -1, -2, -3, -4, -5] ;
false.
0
coder 8 Сен 2017 в 18:06

Я бы разбил его на два вспомогательных предиката. Вспомогательный предикат полезен для построения списка в нужном вам направлении.

create(N, L) :-
    N < 0,
    create_neg(N, 0, L).
create(N, L) :-
    N >= 0,
    create_pos(N, 0, L).

create_neg(N, N, [N]).
create_neg(N, A, [A|T]) :-
    A > N,
    A1 is A - 1,
    create_neg(N, A1, T).

create_pos(N, N, [N]).
create_pos(N, A, [A|T]) :-
    A < N,
    A1 is A + 1,
    create_pos(N, A1, T).

Это также приведет их в правильный порядок:

| ?- create(-5, L).

L = [0,-1,-2,-3,-4,-5] ? a

no
| ?- create(5, L).

L = [0,1,2,3,4,5] ? a

no
| ?- 
1
lurker 8 Сен 2017 в 18:13

То, что вы ищете, на самом деле не программа, а «идиоматический» паттерн:

?- findall(X, (between(0,5,T), X is -T), L).
L = [0, -1, -2, -3, -4, -5].

Обратите внимание на круглые скобки вокруг цели . Это составной ...

По-другому:

?- numlist(-5,0,T), reverse(T,L).
...
1
CapelliC 8 Сен 2017 в 18:49