リストに対して何らかの操作を行う述語を実装するのに問題があります。
実際の例で何をしなければならないかを説明します。
述語は、次の形式を持つリストで機能する必要があります。
TokenList =[t(1, "word1"), t(2, "Word2"), t(3, "Word3"), t(4, "word4")]
これはトークンのリストです。私にとって、トークンは次のようなものです: t(1, "word1")したがって、トークンには「ファンクター」 t があり、それに 2 つの引数があります: 数値 (必ずしもプログレッシブではなく、場合によっては、この値が-1) と単語を表す文字列。
ご覧のとおり、最初の文字が大文字の単語もあります(この例では、2 番目と 3 番目のトークン)。
2 つの連続したトークンが大文字で始まる文字列値を持っていることがわかった場合、単語を一意のトークンに折りたたむ必要があるという述語を作成する必要があります。
たとえば、preious トークン リストは次のように変換する必要があります。
TokenList =[t(1, "word1"), t(2, "Word2 Word3"), t(4, "word4")]
ご覧のとおり、2 番目と 3 番目のトークン (単語) の内容は、コンテンツ フィールドとして「Word2 Word3」を持つ一意のトークンに入れられます。
この述語を実装するには問題があります。私はこのようなことをしようとしていました:
collapseToken([],[]).
collapseToken([t(Number1, String1),t(Number2, String2)|TokenTail],[NewToken|TaggedTokenList]) :-
String1 = [Head1|Tail1],
String2 = [Head2|Tail2],
char_type(Head1, upper),
char_type(Head2, upper),
!,
append(String1, String2, NewString),
NewToken = t(Number1, NewString),
collapseToken(TokenTail, TaggedTokenList).
collapseToken([Head1|Tail1], [Head2|Tail2]) :- collapseToken(Tail1, Tail2).
私のcollapseToken/2述語には、先頭の 2 つのリストがあります。最初のリストは元のリストで、2 番目のリストは結果リストです。
元のリストはt(Number1, String1)とt(Number2, String2)の2 つのトークンで構成されているため、String1 は最初のトークンの単語であり、String2 は 2 番目のトークンの単語です。
したがって、結果の文字列[NewToken|TaggedTokenList] (ここで、NewToken は **t(Number1, [String1|String2]) のようなものです): 最初のトークンの番号とコンテンツとして最初のトークンの単語を持つトークンString1 と String2 のブースが大文字で始まることが TRUE の場合、String1 と String2の連結である **NewString を作成し、NewTokenを作成して結果の先頭に配置します。リスト)。最後に再帰的に自分自身を呼び出します
次に、大文字で始まるコンテンツ ワードの両方を持つ 2 つの連続したタグが存在しない場合に適用される別のルールを作成しました。
しかし、何か問題があり、動作しません。私の一般的な論理は正しいですか?