プロローグのポイントまでリストを分割する
-
21-12-2019 - |
質問
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
所属していません StackOverflow