将列表划分为prolog中的一个点

时间:2014-02-26 03:11:31

标签: prolog dcg prolog-dif

my_list([this,is,a,dog,.,are,tigers,wild,animals,?,the,boy,eats,mango,.]).

假设这是prolog中的一个列表,我希望将它分成三个部分,最多三个句点并将它们存储在变量中。

我该怎么做......

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 个答案:

答案 0 :(得分:4)

更新:@CapelliC评论后代码略有简化。

其中一种方法(另一种更好的方法是使用DCG - 明确的子句语法):

你真的不需要counthowmany。

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

答案 1 :(得分:3)

您的问题陈述未指定没有点的序列应该对应的内容。我认为这将是一个无效的句子 - 因此失败。

:- use_module(library(lambda)).

list_splitted(Xs, Xss) :-
   phrase(sentences(Xss), Xs).

sentences([]) --> [].
sentences([Xs|Xss]) -->
   sentence(Xs),
   sentences(Xss).

sentence(Xs) -->
   % {Xs = [_|_]},  % add this, should empty sentences not be allowed
   allseq(dif('.'),Xs),
   ['.'].

% sentence(Xs) -->
%    allseq(\X^maplist(dif(X),['.',?]), Xs),
%    (['.']|[?]).

allseq(_P_1, []) --> [].
allseq( P_1, [C|Cs]) -->
   [C],
   {call(P_1,C)},
   allseq(P_1, Cs).

答案 2 :(得分:1)

在此回答中,我们根据splitlistIf/3list_memberd_t/3定义split_/2

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