Разделить список до точки в прологе
my_list([this,is,a,dog,.,are,tigers,wild,animals,?,the,boy,eats,mango,.]).
Предположим, это список в прологе, который я хочу разделить на три части, то есть до трех полных остановок, и сохранить их в переменных.
Как мне это сделать...
counthowmany(_, [], 0) :- !.
counthowmany(X, [X|Q], N) :- !, counthowmany(X, Q, N1), N is N1+1.
counthowmany(X, [_|Q], N) :- counthowmany(X, Q, N).
number_of_sentence(N) :- my_list(L),counthowmany(.,L,N).
я уже посчитал количество полных остановок в списке (my_list), теперь я хочу разделить список до первой полной остановки и сохранить его в переменной, а затем разделить до второй полной остановки и сохранить в переменной и т. д........
3 ответа
В вашей постановке задачи не указано, какой последовательности без точки должна соответствовать. Я предполагаю, что это будет недействительным предложением - таким образом, провал.
: - use_module ( библиотека (лямбда)). list_splitted (Xs, Xss): - фраза (предложения (Xss), Xs). предложения ([]) -> []. предложения ([Xs|Xss]) -> предложение (Xs), предложения (Xss). предложение (Xs) -> % {Xs = [_|_]}, % добавляют это, если пустые предложения не допускаются allseq(dif('.'),Xs), ['.']. % предложение (Xs) -> % allseq(\X^maplist(dif(X),['.',?]), Xs), % (['.']|[?]). allseq(_P_1, []) -> []. allseq( P_1, [C|Cs]) -> [C], {call(P_1,C)}, allseq(P_1, Cs).
ОБНОВЛЕНИЕ: код немного упрощен после комментария @CapelliC.
Один из многих способов сделать это (другой, лучший способ - это использовать DCG - грамматику определенного предложения):
Тебе не нужно большое количество людей.
split([], []).
split(List, [Part | OtherParts]) :-
append(Part, ['.' | Rest], List),
split(Rest, OtherParts).
Давай попробуем:
?- my_list(List), split(List, Parts).
List = [this, is, a, dog, '.', tigers, are, wild, animals|...],
Parts = [[this, is, a, dog], [tigers, are, wild, animals], [the, boy, eats, mango]]
В этом ответе мы определяем split_/2
основанный на splitlistIf/3
а также list_memberd_t/3
:
split_(Xs, Yss) :-
splitlistIf(list_memberd_t(['?','.','!']), Xs, Yss).
Примеры запросов:
?- _Xs = [this,is,a,dog,'.', are,tigers,wild,animals,?, the,boy,eats,mango,'.'],
split_(_Xs, Yss).
Yss = [ [this,is,a,dog] ,[are,tigers,wild,animals] ,[the,boy,eats,mango] ].
?- split_([a,'.',b,'.'], Yss).
Yss = [[a],[b]]. % succeeds deterministically