在prolog中将列表分解为一个点

在prolog中将列表分解为一个点,prolog,dcg,prolog-dif,Prolog,Dcg,Prolog Dif,假设这是prolog中的一个列表,我想将它分成三部分,最多三个句号,并将它们存储在变量中 我该怎么做 my_list([this,is,a,dog,.,are,tigers,wild,animals,?,the,boy,eats,mango,.]). 我已经计算了列表(my_list)中的句号数,现在我想将列表分成第一个句号并将其存储在变量中,然后分成第二个句号并存储在变量中,依此类推………更新:代码在@capelical comment之后略微简化 其中一种方法是(另一种更好的方法是使用DC

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

我该怎么做

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

我已经计算了列表(my_list)中的句号数,现在我想将列表分成第一个句号并将其存储在变量中,然后分成第二个句号并存储在变量中,依此类推………

更新:代码在@capelical comment之后略微简化

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

你真的不需要数多少

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).
让我们试试看:

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]] 
:-使用_模块()。 列表被拆分(Xs,Xss):- 短语(句子(Xss),Xs)。 句子([])-->[]。 句子([Xs|Xss])--> 第(Xs)句, 句子(Xss)。 句子(Xs)--> %{Xs=[124; 124;]}%,如果不允许使用空句子,则添加此项 所有序列(dif('.')、Xs), ['.']. %句子(Xs)--> %allseq(\X^maplist(dif(X),[',?]),Xs), % (['.']|[?]). allseq(_P_1,[])-->[]。 allseq(P|u 1[C|Cs])--> [C] ,, {调用(P_1,C)}, 所有顺序(P_1,Cs)。
在这个答案中,我们定义了基于和的
split_u2;/2

示例查询:

split_(Xs, Yss) :-
   splitlistIf(list_memberd_t(['?','.','!']), Xs, Yss).

很不错的。只是拆分/3似乎有点superflous@SergeyDymchenko你的解决方案奏效了,但我在上面问题的列表(我的列表)中做了一些更改,并在末尾添加了一个带“?”符号的疑问句。我认为用句号检查并不能解决现在分句的问题,所以你能帮我一下吗?.......................我得到了两个关于
拆分([a',,b',],Parts)的答案.
第二个答案不正确。如果句号“.”中有一个是问题,我该怎么做sign@Ishrak如果您有多个句子分隔符,则此方法将不起作用。“源接收器库(lambda)”不存在”和“目标(指令)失败:用户:使用模块(库(lambda))”我得到这两个警告,我只是一个初学者在prolog我不明白你的code@Ishrak你有什么系统?是的。你可以-总是添加。但您只需要在有点和问号的情况下使用它。我有Jan Wielemaker的“SWI Prolog 6.4.1版”(jan@swi-在windows和您的代码中,有些行在开头用“%”符号注释掉。我是否需要它们?如果您需要,请在我的电子邮件中向我解释您的代码(ishrak55@live.com)这将对我很有帮助。。。。
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