-1

特定のリストに対して特定の操作を行う際に問題が発生しています。

トークンが単語を表すトークンのリストがあり、このリスト内の 5 つの連続したトークンが次の形式の日付を表しているかどうかを認識したい: 12 Febbraio 1995ここで、12 は日付、Febbraio は月 (イタリア語で) および 1995 は年です (値と値の間は空白です)。

たとえば、前の日付は次のトークン リストです。

[t(1, "12"),t(-1, " "), t(2, "2月"), t(-1, " "), t(3, "1995")]

ご覧のとおり、一般的なトークンには「ファンクター」 t があり、その中には 2 つの引数があります。数値 (必ずしもプログレッシブである必要はありません。場合によっては、この値は -1 になる可能性があります) と、単語を表す文字列です。

次の述語を実装しようとしましたが、問題が見つかりました。

tagga([t(Number1, Day), t(-1, Space1), t(Number3, Month), t(-1, Space2), t(Number4, Year)|ListaToken], [d(Number1, CompositeDateTag)|ListaTokenTaggati) :-

    length(Day, LnDay),
    LnDay =:= 2,
    Day = [Head|Tail],
    char_type(Head, digit),

    Space1 == " ",

    Month == "gennaio"; Month == "febbraio"; Month == "marzo"; Month == "aprile"; Month == "maggio"; Month == "giugno"; Month == "luglio";
    Month == "agosto"; Month == "settembre"; Month == "ottobre"; Month == "novembre"; Month == "dicembre";
    Month == "Gennaio"; Month == "Febbraio"; Month == "Marzo"; Month == "Aprile"; Month == "Maggio"; Month == "Giugno"; Month == "Luglio";
    Month == "Agosto"; Month == "Settembre"; Month == "Ottobre"; Month == "Novembre"; Month == "Dicembre", 
    Space2 == " ",

    length(Year, LnYear),
    LnYear =:= 4,
    NumericString = [Head|Tail],
    char_type(Head, digit),

    append(Day, Space1, UntilSpace1),
    append(UntilSpace1, Month, UntilMonth),
    append(UntilMonth, Space2, UntilSpace2),
    append(UntilSpace2, Year, CompositeDateTag),
    write(CompositeDateTag),


    tagga(ListaToken, ListaTokenTaggati).

ご覧のとおり、私のtagga/2述語には、最初のパラメーターとして日付を表すことができる 5 つのタグ(ルールの本文が TRUE の場合) と、一意の特殊なトークンを表す 2 番目のパラメーター (前の例を参照すると、この新しいトークンはbe: **d(1, "12 Febbraio 1995")

したがって、新しい特殊なトークンを作成するには、次のようにいくつかのプロパティが true であることを確認する必要があります。

1) 最初の一般トークンの内容は 1 日を表すため、2 桁の数字である必要があります。

2) 2 番目の一般トークンの内容は、空白 " " です。

3) 3 番目の一般トークンの内容は、イタリア語の月の名前です。

4) 4 番目の一般トークンの内容は 1 日を表すため、2 桁の数字である必要があります。

5) 5 番目の一般トークンの内容は年を表すため、4 桁の数字である必要があります。

最後に、 CompositeDateTag変数である新しい特殊なデータ トークンのコンテンツが作成されます。

問題は、3 番目の一般的なトークンの内容が月名のリストに属しているかどうかを確認した後で発生します

これを行うには、Month変数の値が gennaio OR febbraio OR marzo などであるかどうかを;を使用して確認します。演算子はORですが、何か問題が発生しました。実際、次のトレースが得られます。

[trace]  ?- tagga([t(1, "12"),t(-1, " "), t(2, "febbraio"), t(-1, " "), t(3, "1995")], NewToken).
   Call: (6) tagga([t(1, [49, 50]), t(-1, [32]), t(2, [102, 101, 98, 98|...]), t(-1, [32]), t(3, [49, 57|...])], _G445) ? creep
   Call: (7) length([49, 50], _G602) ? creep
   Exit: (7) length([49, 50], 2) ? creep
^  Call: (7) 2=:=2 ? creep
^  Exit: (7) 2=:=2 ? creep
   Call: (7) [49, 50]=[_G594|_G595] ? creep
   Exit: (7) [49, 50]=[49, 50] ? creep
   Call: (7) char_type(49, digit) ? creep
   Exit: (7) char_type(49, digit) ? creep
   Call: (7) [32]==[32] ? creep
   Exit: (7) [32]==[32] ? creep
   Call: (7) [102, 101, 98, 98, 114, 97, 105, 111]==[103, 101, 110, 110, 97, 105, 111] ? creep
   Fail: (7) [102, 101, 98, 98, 114, 97, 105, 111]==[103, 101, 110, 110, 97, 105, 111] ? creep
   Call: (7) [102, 101, 98, 98, 114, 97, 105, 111]==[102, 101, 98, 98, 114, 97, 105, 111] ? creep
   Exit: (7) [102, 101, 98, 98, 114, 97, 105, 111]==[102, 101, 98, 98, 114, 97, 105, 111] ? creep
   Exit: (6) tagga([t(1, [49, 50]), t(-1, [32]), t(2, [102, 101, 98, 98|...]), t(-1, [32]), t(3, [49, 57|...])], [d(1, _G592)|_G589]) ? creep
NewToken = [d(1, _G592)|_G589] 

ご覧のとおり、渡された月の文字列 "febbraio" と月のリストの値の間で正しい一致を見つけるようです。

   Call: (7) [102, 101, 98, 98, 114, 97, 105, 111]==[102, 101, 98, 98, 114, 97, 105, 111] ? creep
   Exit: (7) [102, 101, 98, 98, 114, 97, 105, 111]==[102, 101, 98, 98, 114, 97, 105, 111] ? creep

しかし、私のコードにある次のチェックを実行せずにtagga/2述語を再度呼び出すことをスキップしているようです。

    Space2 == " ",

length(Year, LnYear),
LnYear =:= 4,
NumericString = [Head|Tail],
char_type(Head, digit),

なんで?何が問題ですか?どうすれば解決できますか?月のリストを使用して、文字列値が文字列に存在するかどうかを言うこともできると思いますが、私の解釈には問題があると思います; 意味。

4

1 に答える 1

1

これは、リストに基づく CapelliC のアイデアを使用して、問題に対する私の最終的な解決策です。

tagga([t(Number1, Day), t(-1, Space1), t(Number3, Month), 
                        t(-1, Space2), t(Number4, Year) | ListaToken], 
      [d(Number1, CompositeDateTag) | ListaTokenTaggati]) :-

    length(Day, LnDay),  (LnDay =:= 1; LnDay =:= 2),
    Day = [Head|Tail],   char_type(Head, digit),

    Space1 == " ",

    member(Month, 
           ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno",
            "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre",
            "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", 
            "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"]),

    Space2 == " ",

    length(Year, LnYear),  LnYear =:= 4,    

    NumericString = [Head|Tail],  char_type(Head, digit),

    append(Day, Space1, UntilSpace1),
        append(UntilSpace1, Month, UntilMonth),
        append(UntilMonth, Space2, UntilSpace2),
        append(UntilSpace2, Year, CompositeDateTag),

    tagga(ListaToken, ListaTokenTaggati).
于 2013-06-03T09:29:51.977 に答える