我想创建一个程序,其中用户将给出一个负数,它将返回一个从零开始直到该数字的列表。这是一个理想的输出示例 创建(-5,L)。 L = [0,-1,-2,-3,-4,-5]
你能以任何方式帮助我吗?答案 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>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.