2013-06-01 63 views
-1

我有一些問題在特定列表上執行特定操作。Prolog謂詞做錯用法或;

我有令牌的列表,其中一個令牌代表一個字,我想承認,如果在此列表中5個連續的令牌,代表具有形式的日期:1995年12 Febbraio,其中12是天數,Febbraio是月(在意大利語言)和1995年是一年(和值,另一間是一個空格)

例如以前的日期是下列標記列表:

[T( 1,「12」),t(-1,「」),t(2,「Febbraio」),t(-1,「」),t(3,「1995」)]

正如你可以看到一個通用的標記有一個「函子」t並且它有兩個參數:一個數字(不一定是漸進的,在某些情況下我有這個值可以是-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謂詞具有作爲第一paramether 五個tag,可以代表日期 (如果規則的主體爲TRUE)和第二個參數表示一個唯一的專用標記(參考前面的例子,這個新標記將是:** d(1,「12 Febbraio 1995」),其具有

因此,要創建新的專用令牌它h AVE檢查某些屬性都爲真,如:

1)所述第一一般令牌的內容表示一個日:所以它必須是一個數由2位數字

2)的含量第二個一般令牌是一種白色空間「」

3)第三個一般令牌的內容是在意大利語言

4)第四一般令牌的內容一個個名字代表了天:所以它必須是由2位數組成的數字

5)第五一般令牌的內容表示年所以它必須是一個數組成的4個位數

最後,創建新的專門數據的內容令牌是CompositeDateTag變量

問題出現之後,它會檢查第三個一般令牌的內容是否屬於月份名稱的列表。

做到這一點我檢查變量值gennaio OR febbraio OR馬索等,使用;運營商爲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), 

爲什麼?問題是什麼?我該如何解決?我認爲我也可以使用一個月份列表,並說出字符串值是否存在於字符串中,但現在我認爲我的解釋存在一些問題;含義。

+0

是什麼'{{'...'}}'? –

+0

我不能說什麼{{...; ...}}的意思(除庫(clpqr))。這是你的控制結構? – CapelliC

+0

nono我剛剛從我的代碼中刪除...這是舊版本的代碼...現在我還沒有{{}} – AndreaNobili

回答

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