如何创建一个与多个单词列表匹配的Prolog规则?

时间:2013-06-03 09:59:33

标签: prolog logic declarative

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

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

1)第一种形式: 1°Marzo 1995

2)SECONDO FORM: 1995年Marzo的1°

做一个具体的例子,说明我在识别令牌列表时的意思。

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

[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,[111102]),T(-1,[32]),T(4,[49,57,57,53]),T(-1,[10]) ]

正如你所看到的,一般标记有一个“仿函数”,并且有两个参数:一个数字(不一定是渐进的,如果一个标记不代表一个单词,但是它与一个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) ,年份)| 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)

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

1 个答案:

答案 0 :(得分:0)

到目前为止,最简单的方法是声明两个替代方案,让Prolog与相应的方法匹配。

这可能导致长期维护问题,然后值得评估您愿意支持多少这样的模式,并最终分解出公共代码。

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