Чтение элементов списка в другой список, пока не встретится специальный символ - PullRequest
0 голосов
/ 28 ноября 2011

Я читаю файл, содержащий контекстно-свободную грамматику, размечаю каждую строку и создаю список вида

L = ['S', =, a, 'S', b, ;, 'S', =, c;].

В списке ';'означает новую строку.Этот список может расширяться в зависимости от грамматики в файле.Теперь я хотел разделить список для каждого ';'встретил.

Например, рассмотрим следующее правило

getRule(List, First, Rest):-

Я должен быть в состоянии получить первую грамматическую строку 'S', =, a, 'S', b, как first , а оставшийся список как Rest каждый раз рекурсивно.

1 Ответ

1 голос
/ 28 ноября 2011

Вот и все (как разделить ваш список на правила):

getRules([], _Delimiter, []) :- !.
getRules(List, Delimiter, [Rule|Rules]) :-
    getRule(List, Delimiter, Rule, Rest),
    getRules(Rest, Delimiter, Rules).

Использование запрошенного вами getRule:

getRule([], _Delimiter, [], []) :- !.
getRule([Delimiter|Rest], Delimiter, [], Rest) :- !.
getRule([Item|List], Delimiter, [Item|Rule], Rest) :-
    getRule(List, Delimiter, Rule, Rest).

Возможность вызова с помощью

?- 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]].

Вы можете явно использовать жесткий код;если хотите!
Пожалуйста, спросите, нужно ли вам какое-либо объяснение кода.
Я добавил модификацию, обсуждаемую в комментариях, и удалил спойлеры, так как вы ее прочитали.

Вот еще одна вещь, которую вы просили:

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

Вот мое предположение, но я не могу запустить интерпретатор пролога, поэтому он не проверен:

grammarize([], []) :- !.
grammarize([[Left, ::=|Right]|PureRules], [grammar(Left, Right)|Grammars]) :-
    grammarize(PureRules, Grammars).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...