質問

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

これがプロローグのリストで、最大 3 つのピリオドまでの 3 つの部分に分割し、変数に格納したいとします。

どうやってやるの...

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)内のピリオドの数を数えています。今度はリストを最初のピリオドまで分割して変数に保存し、次に2番目のピリオドまで分割して変数に保存したいと考えています。 ……

役に立ちましたか?

解決

あなたの問題ステートメントは、ドットなしのシーケンスがどのようなものに対応するかを指定しませんでした。これが無効な文になると思います - したがって失敗しました。

:- 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).
.

他のヒント

更新:@Capellicコメントの後に少し簡略化されたコード。

それをするための多くの方法の1つ(別の、より良い方法 - dcg - dectiite句の文法を使用すること):

あなたは本当にcountowmanyを必要としません。

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top