Prolog:列表中的模式匹配
Prolog: pattern matching within a list
定义一个关系 xyz(X) 如果 X 是一个 xyz 序列则该关系为真。 xyz 序列是由数字 0 或数字 1 后跟两个其他 xyz 序列组成的序列。
一些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]).
谁能帮我解决这个问题?
最简单的就是写一个DCG。有关详细介绍,请参阅 this tutorial。您可以逐字逐句地写下问题陈述以获得解决方案:
xyz --> [0].
xyz --> [1], xyz, xyz.
您将需要 phrase
:
?- phrase(xyz, [1,0,1,0,0]).
这个解决方案留下了一个选择点。
这种简单的语法非常适合理解为 DCG 提供动力的机制(尽管已简化):
seq(S) :- seq(S, []).
seq([0|R], R).
seq([1|T], R) :- seq(T, Q), seq(Q, R).
定义一个关系 xyz(X) 如果 X 是一个 xyz 序列则该关系为真。 xyz 序列是由数字 0 或数字 1 后跟两个其他 xyz 序列组成的序列。
一些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]).
谁能帮我解决这个问题?
最简单的就是写一个DCG。有关详细介绍,请参阅 this tutorial。您可以逐字逐句地写下问题陈述以获得解决方案:
xyz --> [0].
xyz --> [1], xyz, xyz.
您将需要 phrase
:
?- phrase(xyz, [1,0,1,0,0]).
这个解决方案留下了一个选择点。
这种简单的语法非常适合理解为 DCG 提供动力的机制(尽管已简化):
seq(S) :- seq(S, []).
seq([0|R], R).
seq([1|T], R) :- seq(T, Q), seq(Q, R).