我在Prolog中创建了一个程序,它从一个开始返回以下两个幂:
twos(N, L) :- twosH(N, 1, L).
twosH(0, _, L) :- L = [], !.
twosH(N, I, [R|L]) :- R is 2*I, N1 is N-1, twosH(N1, R, L).
我希望它使用差异列表而不是常规列表。我知道如何将元素附加到差异列表:
appendD(A-B, B-C, A-C).
但我不知道如何将其纳入我的计划。
答案 0 :(得分:2)
如果您使用DCG,那么您使用的是差异列表:
powers_of_2(0, 1) --> [1].
powers_of_2(N, PT) --> [PT], { PT #= 2 * PT1, N #> 0, N #= N1 + 1 }, powers_of_2(N1, PT1).
powers_of_2(N, PT) :-
phrase(powers_of_2(N, _), PT).
| ?- powers_of_2(4, P).
P = [16,8,4,2,1] ? ;
no
| ?-
DCG看起来像标准谓词的列表(通过输入listing.
获得然后我稍微更改了变量名称):
powers_of_2(0, 1, [1|T], T).
powers_of_2(N, PT, [PT|PTs], T) :-
PT #= 2 * PT1,
N #> 0,
N #= N1 + 1,
powers_of_2(N1, PT1, PTs, T).
如果您直接调用它,则会将空列表作为最终尾部:
| ?- powers_of_2(4, P, PT, []).
P = 16
PT = [16,8,4,2,1] ? ;
no
如果您希望数字按相反顺序排列,我会将其作为练习。 :)