我有一些問題在特定列表上執行特定操作。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),
爲什麼?問題是什麼?我該如何解決?我認爲我也可以使用一個月份列表,並說出字符串值是否存在於字符串中,但現在我認爲我的解釋存在一些問題;含義。
是什麼'{{'...'}}'? –
我不能說什麼{{...; ...}}的意思(除庫(clpqr))。這是你的控制結構? – CapelliC
nono我剛剛從我的代碼中刪除...這是舊版本的代碼...現在我還沒有{{}} – AndreaNobili