假设我有以下语境免费语法。
S -> A
A -> mAn
A -> o
这怎么看prolog?这是我尝试过但它不起作用。第二行似乎是问题。
S(Z) :- A(Z).
A(Z) :- append([m],X,Z2), A(X), append(Z2,[n],Z).
A([o]).
答案 0 :(得分:4)
由于语法不是递归的,我们可以使用DCG:
File.Delete(filePath.Substring(filePath.Length - 4) + ".bak");
File.Move(filePath, filePath.Substring(0, filePath.Length - 4) + ".bak");
然后我们可以解析或生成所有接受的序列。例如,生成:
s --> a.
a --> [m], a, [n].
a --> [o].
检查Prolog代码:
?- length(L, _), phrase(s, L).
L = [o]
L = [m, o, n]
L = [m, m, o, n, n]
...
由于差异列表,不需要附加/ 3 使用append / 3
编辑
?- listing(s).
s(A, B) :-
a(A, B).
?- listing(a).
a([m|A], C) :-
a(A, B),
B=[n|C].
a([o|A], A).
SWI-Prolog追加/ 2(简单地基于追加/ 3正确链接),给予 更可读的替代方案
s(Z) :- a(Z).
a(Z) :- append([m|X],[n],Z), a(X).
a([o]).
无论如何,我们必须在构建/拆分列表之后递归调用
答案 1 :(得分:3)