创建从零到负数的列表

时间:2017-09-08 16:42:01

标签: prolog

我想创建一个程序,其中用户将给出一个负数,它将返回一个从零开始直到该数字的列表。这是一个理想的输出示例     创建(-5,L)。     L = [0,-1,-2,-3,-4,-5]

你能以任何方式帮助我吗?

3 个答案:

答案 0 :(得分:1)

我会将其分解为两个辅助谓词。辅助谓词有助于按照您希望的方向构建列表。

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 :(得分:1)

你所追求的并不是一个真正的程序,只是一种“惯用”模式:

[00007f84a368a848] live555 demux error: Failed to connect with rtsp://xx.xxx.x.xxx:554/play1.sdp
[00007f84a59b4918] core input error: open of `rtsp://xx.xxx.x.xxx:554/play1.sdp' failed
[00007f84a59b4918] core input error: Your input can't be opened
[00007f84a59b4918] core input error: VLC is unable to open the MRL 'rtsp://xx.xxx.x.xxx:554/play1.sdp'. Check the log for details.

请注意目标周围的括号。这是一个复合的......

另一种方式:

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

答案 2 :(得分:0)

由于您提供了代码(在评论中提到的代码会更好地出现在您的问题中),我认为有一个问题是使用X>0X<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.