我有以下序言功能
range(Floor, Ceil, _) :- Ceil2 is Ceil+1, range(Floor, Ceil2, [], Floor).
range(_, Ceil, L, Ceil):- write(L), !.
range(Floor, Ceil, L, Cnter):- concatenate(L, [Cnter], L2), Cnter2 is Cnter + 1, range(Floor, Ceil, L2, Cnter2).
我想得到一个在floor和ceil之间的所有数字的列表,我可以使它正常工作,但是它只打印出列表,而不会将其返回作为查询的解决方案。
预期输出为: range(2,7,R)=> R = [2,3,4,5,6,7]
相反,我得到了 range(2,7,R)=> [2,3,4,5,6,7];是的。
仅将列表打印为功能的一部分。
我怀疑我还在以一种迭代的方式思考,这是我问题的根源。
编辑以添加连接功能
concatenate([], L, L).
concatenate([X|Y], L1, [X|L2]) :- concatenate(Y, L1, L2).
在@coder的帮助下解决方案
rank(Ceil, Ceil, []).
rank(Floor, Ceil, [Floor|R2]):- Floor2 is Floor + 1, range(Floor2, Ceil, R2), !.
答案 0 :(得分:3)
您只需要更改一些range/4
谓词:
range(Floor, Ceil, R) :- Ceil2 is Ceil+1, range(Floor, Ceil2, R, Floor).
range(_, Ceil, [], Ceil).
range(Floor, Ceil, [Cnter|L], Cnter):-
Cnter2 is Cnter + 1, range(Floor, Ceil, L, Cnter2)