将以下数字添加到Prolog中的差异列表中

时间:2018-02-04 18:55:37

标签: prolog

我在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).

但我不知道如何将其纳入我的计划。

1 个答案:

答案 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

如果您希望数字按相反顺序排列,我会将其作为练习。 :)