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)。