Prolog 将列表元素读入另一个列表,直到遇到特殊字符为止
我正在阅读一个包含上下文无关语法的文件,并对每一行进行标记并生成表单列表Prolog 将列表元素读入另一个列表,直到遇到特殊字符为止,prolog,Prolog,我正在阅读一个包含上下文无关语法的文件,并对每一行进行标记并生成表单列表 L = ['S', =, a, 'S', b, ;, 'S', =, c;]. 在列表中“;”意思是新线。此列表可以根据文件中的语法进行扩展。 现在我想为每个“;”划分列表遇到 例如,考虑下面的规则 getRule(List, First, Rest):- 我应该能够每次递归地得到第一行语法'S',=,a,'S',b,作为first,剩下的列表作为Rest。以下是全部内容(如何将列表拆分为规则): 使用您要求的getR
L = ['S', =, a, 'S', b, ;, 'S', =, c;].
在列表中“;”意思是新线。此列表可以根据文件中的语法进行扩展。
现在我想为每个“;”划分列表遇到
例如,考虑下面的规则
getRule(List, First, Rest):-
我应该能够每次递归地得到第一行语法'S',=,a,'S',b,作为first,剩下的列表作为Rest。以下是全部内容(如何将列表拆分为规则):
使用您要求的getRule:
getRule([], _Delimiter, [], []) :- !.
getRule([Delimiter|Rest], Delimiter, [], Rest) :- !.
getRule([Item|List], Delimiter, [Item|Rule], Rest) :-
getRule(List, Delimiter, Rule, Rest).
divideRules(Rules, PureRules) :-
divideRules_(Rules, Temp),
append(Temp, PureRules).
divideRules_([], []) :- !.
divideRules_([Rule|Rules], [PureRule|PureRules]) :-
divideRule(Rule, PureRule),
divideRules_(Rules, PureRules).
divideRule(Rule, PureRule) :-
getRule(Rule, ::=, Left, Right),
append([Left, [::=]], NewLeft),
getRules(Right, '|', PureRight),
maplist(append(NewLeft), PureRight, PureRule).
打电话给
?- getRule(['S', =, a, 'S', b, ;, 'S', =, c, ;], ;, Rule, Rest).
返回
Rule = ['S', =, a, 'S', b],
Rest = ['S', =, c, ;].
主要的一点是:
?- getRules(['S', =, a, 'S', b, ;, 'S', =, c, ;], ;, Rules).
返回
Rules = [['S', =, a, 'S', b], ['S', =, c]].
显然,你可以硬编码;如果你愿意请询问您是否需要有关代码的任何解释。
我添加了评论中讨论的修改,并在您阅读后删除了扰流板 这是你要求的另一件事:
getRule([], _Delimiter, [], []) :- !.
getRule([Delimiter|Rest], Delimiter, [], Rest) :- !.
getRule([Item|List], Delimiter, [Item|Rule], Rest) :-
getRule(List, Delimiter, Rule, Rest).
divideRules(Rules, PureRules) :-
divideRules_(Rules, Temp),
append(Temp, PureRules).
divideRules_([], []) :- !.
divideRules_([Rule|Rules], [PureRule|PureRules]) :-
divideRule(Rule, PureRule),
divideRules_(Rules, PureRules).
divideRule(Rule, PureRule) :-
getRule(Rule, ::=, Left, Right),
append([Left, [::=]], NewLeft),
getRules(Right, '|', PureRight),
maplist(append(NewLeft), PureRight, PureRule).
以下是我的猜测,但我现在无法运行prolog解释器,因此它未经测试:
grammarize([], []) :- !.
grammarize([[Left, ::=|Right]|PureRules], [grammar(Left, Right)|Grammars]) :-
grammarize(PureRules, Grammars).
您的代码正在工作,但当我使用
get_规则(['S',:=,a,'S',b,;,'S',:=,c],;,规则)调用时,
返回false…为什么?因为没有;最后,您可以添加getRule([],_分隔符,[],[]):-!。在getRule子句的顶部,使其即使在没有规则的情况下也能工作;最后!我已经回答了!?-getRule(['S',=,a'S',b,;,'S',=,c,;],;,Rule,Rest)。将第一条规则放入规则中。顺便说一句,如果您已经计算了规则,则无需调用getRule来计算第一条规则,您只需编写[first | u Rules]=Rules@bharathkumar:发布了一些东西,用法是?-divideRules([[S',::=,a',S',b],'S',::=,c',|',d]],PureRules)。