Prolog问题 - 简单的语法实现

时间:2011-05-11 23:50:29

标签: prolog dcg

如果我有以下语法:

S → ε

S → a S b S

如何在Prolog中实现它?

我试过了:

isMatched([]).

isMatched([a,b]).

isMatched([a|[S1|[b|S2]]]) :- isMatched(S1), isMatched(S2).

但它显然不起作用,因为列表的头部不能是列表。

然后我尝试按如下方式实施新版本:

conc([], R, R).

conc([H|T], L, [H|R]) :- conc(T, L, R).

isMatched([]).

isMatched([a,b]).

isMatched(List) :- conc([a], S1, List3), isMatched(S1), conc(List3, [b], List2), conc(List2, S2, List), isMatched(S2).

但对于输入isMatched([a,b,a]),它会耗尽堆栈。

如何解决此问题?

1 个答案:

答案 0 :(得分:2)

听起来像是家庭作业,所以我不会试着为你做这件事。

您可能想看看Prolog中的明确子句语法(DCG)。这基本上是语法糖,允许你编写更像语法而不是Prolog谓词的语法。如果您了解这些是如何工作的,那么您可能对如何在Prolog中进行解析有了一个很好的理解。