Разделить список до точки в прологе

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
Другие вопросы по тегам