需要帮助在序言中编写列表

Need help for programming a list in prolog

我希望 Prolog return 仅当列表是用字母 {a,b} 构建并且它只有一个字母 b 或零次字母 b 和任意数量的字母 a 时才为真但空列表也是如此。例如:{} 为真,{aaabaaa} 为真,{a} 或 {b} 为真,{baaaaa} 为真。但是{baaaab}是假的,{bb}是假的。

这是我尝试做的,但它没有像我想要的那样工作:

语言([]).

语言([a,b]).

语言([a | S]):- 语言(S).

您可以想象一个消耗其输入的状态机。它有 2 种状态,一种是您可以“吃掉”任意数量的 a,如果它消耗了所有输入则成功。如果在那个状态下你消耗了一个 b 你会进入第二个状态,它只接受任意数量的 as 并且如果它消耗所有输入再次成功:

% state 1:
as_or_b([]).
as_or_b([a|L]):- as_or_b(L).
as_or_b([b|L]):- as(L).

% state 2:
as([]).
as([a|L]):- as(L).

样本运行:

?- as_or_b([]).
true.

?- as_or_b([a]).
true.

?- as_or_b([b]).
true.

?- as_or_b([a,a,b,a,a]).
true.

?- as_or_b([a,a,b,a,a,b]).
false.