2
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)中句号的数量现在我想将列表划分为第一个句号并将其存储在一个变量中,然后划分为第二个句号并存储在一个变量中等等.. …………

4

3 回答 3

4

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

许多方法之一(另一种更好的方法 - 是使用 DCG - 定句语法):

你真的不需要counthowman。

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]] 
于 2014-02-26T05:28:49.110 回答
3

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

:- 使用模块(库(lambda))。

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],
   {呼叫(P_1,C)},
   allseq(P_1,Cs)。
于 2014-02-26T16:09:14.063 回答
1

在这个答案中,我们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
于 2015-11-02T10:17:29.440 回答