-1

我在对特定列表执行特定操作时遇到了一些问题。

我有一个标记列表,其中标记代表一个单词,我想使用单个谓词来识别此列表中的某些连续标记是否代表可能采用以下两种形式的日期:

1) 第一形式:1° Marzo 1995

2) 第二种形式:1° Marzo of 1995

当我提到令牌列表时,就我的意思做一个具体的例子。

这是与第一种形式相关的令牌列表:

[t(1,[49]),t(-1,[176]),t(-1,[32]),t(2,[77,97,114,122,111]),t(-1,[32]) ,t(3,[49,57,57,53]),t(-1,[10])]

这是与第二种形式相关的令牌列表:

[t(1,[49]),t(-1,[176]),t(-1,[32]),t(2,[77,97,114,122,111]),t(-1,[32]) ,t(3,[111,102]),t(-1,[32]),t(4,[49,57,57,53]),t(-1,[10])]

正如您所看到的,一个通用标记有一个“函子”t,其中有两个参数:一个数字(不一定是渐进的,如果一个标记不代表一个单词但与一个 alnum 字符不同,它的值为 -1)和表示单词或单个字符的字符串(如空格或“°”等)

我已经实现了一个很好的工作谓词,它可以识别令牌列表中的 7 个连续通用令牌是否代表一个日期(如1° Marzo 1995),然后通过连接构建一个单独的专用数据令牌,以这种方式:

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

    length(Day, LnDay),
    (LnDay =:= 1; LnDay =:= 2),
    Day = [Head|Tail],
    char_type(Head, digit),
    %number_codes(DayNumber, Day),
    %DayNumber =< 31,

    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, "°", UntilSt),
    append(UntilSt, Space1, UntilSpace1),
        append(UntilSpace1, Month, UntilMonth),
        append(UntilMonth, Space2, UntilSpace2),
        append(UntilSpace2, Year, CompositeDateTag),

    tagga(ListaToken, ListaTokenTaggati).

现在我可以实现一个额外的谓词来识别令牌列表中的 9 个连续通用令牌是否代表第二种形式的日期(例如:15 Marzo of 1995)但我会知道我是否可以修改我以前的 tagga/2谓词来做它承认满足第一种和第二种形式的两个日期

我的推理如下,我有一个令牌列表,可能类似于:

[t(Number1, Day), t(-1, "°"), t(-1, Space1), t(Number4, Month), t(-1, Space2), t(Number6, Year)|ListaToken]在第一次日期表格的情况下

或类似的东西:

[t(Number1, Day), t(-1, "°"), t(-1, Space1), t(Number4, Month), t(-1, Space2), t(Number7, "of"), t(-1, Space3), t(Number9, Year)|ListaToken]SECOND DATE FORM的情况下

好的,我会知道我是否可以以某种方式将这两种形式组合成一个与两者匹配的通用形式,然后对其进行操作......

像这样的东西:

[t(Number1, Day), t(-1, "°"), t(-1, Space1), t(Number4, Month) | SUBLIST |t(Number9, Year)|ListaToken]

子列表可能在哪里:

1) 单个令牌:t(-1, Space2)

或者

2) 像这样的令牌列表:t(-1, Space2), t(Number7, "of"), t(-1, Space3)

这个主意好吗?有人可以帮我实现这样的谓词吗?(我正在尝试,但是直到现在我还没有得到结果)

4

1 回答 1

0

到目前为止,最简单的方法是声明这两种选择,并让 Prolog 匹配适当的选择。

这可能会导致长期维护问题,然后可能值得评估您愿意支持多少此类模式,并最终排除通用代码。

最重要的细节是您的规则应该是无副作用的- 乍一看似乎。

于 2013-06-03T10:40:01.297 回答