【发布时间】:2020-11-16 21:43:04
【问题描述】:
我正在尝试制作一个简单的语法解析器来检查特定句型是否有效。语法规则如下:
接线端:circleplus, circleor, 1, 0
非终结符:S; T
开始符号:S
制作规则:S --> S circleplus T | S 圆环 T | T, 和: T --> 0 | 1
sentence([]).
sentence([a, b, c|Tail]) :- checkHead(a), checkC(b), checkT(c), sentenceCheck(Tail).
sentenceCheck([]).
sentenceCheck([b, c|Tail]) :- checkC(b), checkT(c), sentenceCheck(Tail).
checkT(c) :- T(c).
checkC(b) :- C(b).
checkHead(a) :- Head(a).
C(circleor).
C(circleplus).
Head(0).
Head(1).
T(0).
T (1).
% ?- sentence ([[0 , circleor ,1] , circleplus ,1]) .
% ==> true
底部的 cmets 是示例输入 --> 输出的样子。 感谢任何帮助。
编辑:(根据我的问题的回答)
sentence([]).
sentence([A, B, C|Tail]) :- checkHead(A), checkC(B), checkT(C), sentenceCheck(Tail).
sentenceCheck([]).
sentenceCheck([B, C|Tail]) :- checkC(B), checkT(C), sentenceCheck(Tail).
checkT(C) :- t(C).
checkC(B) :- c(B).
checkHead(A) :- head(A).
c(circleor).
c(circleplus).
head(0).
head(1).
t(0).
t(1).
现在查询 sentence([0, circleor, 1]). 返回 false,而它应该是 true。有什么想法吗?
【问题讨论】:
-
正如我回答的那样,您已经编辑了您的问题。我应该编辑我的答案还是就足够了?
-
这就够了,我会把它改成你所拥有的,因为它更干净,更符合 Prolog 的规则:)