序言:模式列表中匹配(Prolog: pattern matching within a list)

2019-10-22 04:37发布

限定的关系的xyz(X),其为真,如果X为XYZ序列。 甲XYZ序列是由任一数字0,或者随后两个其他XYZ序列编号1的序列。

有些XYZ序列:

xyz([0]).
xyz([1,0,1,0,0]).

而且,以下属于XYZ序列:

xyz([1,1,0,0]).
xyz([0,1,0]).
xyz([1,1,0]).
xyz([1,0,1,1,1,1,1,0,1]).

有人可以帮我如何处理这个问题呢?

Answer 1:

最简单的是写一个DCG。 请参见本教程的深入的介绍。 你可以从字面上写下问题声明逐字得到一个解决方案:

xyz --> [0].
xyz --> [1], xyz, xyz.

您将需要phrase

?- phrase(xyz, [1,0,1,0,0]).

该解决方案留下一个选择点之后。



Answer 2:

这种简单的语法是理想了解机构(虽然简化),该功率DCG中:

seq(S) :- seq(S, []).

seq([0|R], R).
seq([1|T], R) :- seq(T, Q), seq(Q, R).


文章来源: Prolog: pattern matching within a list
标签: prolog dcg