Prolog - 在回溯上生成交替符号:[a]; [A,B].[A,B,A]; [A,B,A,B]

Dim*_*pov 6 list prolog dcg

我已经把我的思绪包裹了很多,无法理解.是否可以使用回溯生成以这种格式生成列表的脚本:

[a]
[a,b]
[a,b,a]
[a,b,a,b]
...
Run Code Online (Sandbox Code Playgroud)

我已经制作了一个一次生成两个元素但我的头开始受伤试图制作一个产生"a",下一次"b"和下一个"a"等等.

这是一次两个元素的脚本:

ab([a]).
ab([b,a|T]):-ab([a|T]).
ab([a,b|T]):-ab([b|T]).
Run Code Online (Sandbox Code Playgroud)

mat*_*mat 8

在描述列表时,请始终考虑使用DCG表示法.

这使得它非常方便地集中在一个本质的你想描述的东西,没有那么多额外的变量和参数.

例如,考虑:

abs --> [a], abs_rest.

abs_rest --> [].
abs_rest --> [b], ( [] | abs ).

示例查询和答案:

?- phrase(abs, ABs).
ABs = [a] ;
ABs = [a, b] ;
ABs = [a, b, a] ;
ABs = [a, b, a, b] ;
ABs = [a, b, a, b, a] ;
ABs = [a, b, a, b, a, b] .

有关这种方便的形式主义的更多信息,请参阅!