Prolog谓词在列表元素上执行一系列操作的一些问题

时间:2013-05-31 20:20:09

标签: prolog

我在实现对列表执行某些操作的谓词时遇到了一些问题。

我用一个实际例子解释我要做的事情:

谓词必须处理具有以下形式的列表:

TokenList = [t(1,“word1”),t(2,“Word2”),t(3,“Word3”),t(4,“word4”)] < / p>

这是一个令牌列表。对我来说,一个标记就像是: t(1,“word1”)所以一个标记有一个“仿函数”并且它有两个参数:一个数字(在某些情况下不一定是渐进的)我有这个值可以是-1)和一个字符串来表示一个单词。

正如您所看到的,某些单词可以包含大写的第一个字母(在此示例中为第二个和第三个标记)

我必须构建一个谓词,当发现两个连续的标记具有以大写字母开头的字符串值时,必须将它们折叠成一个唯一的标记。

例如,必须将先前的令牌列表转换为:

TokenList = [t(1,“word1”),t(2,“Word2 Word3”),t(4,“word4”)]

正如您所看到的那样,第二个和第三个令牌(单词)的内容被放入一个唯一的令牌,其中“Word2 Word3”作为内容字段

我有一些问题要实现这个谓词。我试图做这样的事情:

collapseToken([],[]).

collapseToken([t(Number1, String1),t(Number2, String2)|TokenTail],[NewToken|TaggedTokenList]) :-
    String1 = [Head1|Tail1],
    String2 = [Head2|Tail2],
    char_type(Head1, upper),
    char_type(Head2, upper),
    !,
    append(String1, String2, NewString),
    NewToken = t(Number1, NewString),
    collapseToken(TokenTail, TaggedTokenList).

    collapseToken([Head1|Tail1], [Head2|Tail2]) :- collapseToken(Tail1, Tail2).

我的 collapseToken / 2 谓词在头部有两个列表:第一个是原始列表,第二个是结果列表

原始列表由两个令牌组成: t(Number1,String1) t(Number2,String2),因此 String1是单词第一个标记 String2是第二个标记的单词

结果字符串 [NewToken | TaggedTokenList] (其中 NewToken类似于** t(Number1,[String1 | String2])确实如此:具有该数字的标记第一个令牌的内容和内容第一个令牌的单词后跟第二个令牌的单词)如果为TRUE,则String1和String2 booth以大写字符开头,因此创建一个** NewString 即串联然后创建 NewToken 以放入结果列表的头部。 Finnally recursivly称自己为

然后我创建了另一条规则,当这不适用时,有两个连续标签同时包含以大写字母开头的内容词

但是有些不对劲并且不起作用。我的一般逻辑是对的吗?

1 个答案:

答案 0 :(得分:1)

我做了一些调整,以处理3个(或更多)连续的大写字符串:

collapseToken([],[]).

collapseToken([t(Number1, String1),t(_Number2, String2)|TokenTail],TaggedTokenList) :-
    String1 = [Head1|_Tail1],
    String2 = [Head2|_Tail2],
    char_type(Head1, upper),
    char_type(Head2, upper),
    !,
    append([String1, " ", String2], NewString),
    NewToken = t(Number1, NewString),
    collapseToken([NewToken|TokenTail], TaggedTokenList).

collapseToken([Head1|Tail1], [Head1|Tail2]) :-
    collapseToken(Tail1, Tail2).

试验:

?- collapseToken([t(1, "word1"), t(2, "Word2"), t(3, "Word3"), t(4, "word4")],L).
L = [t(1, "word1"), t(2, "Word2 Word3"), t(4, "word4")].

?- collapseToken([t(1, "word1"), t(2, "Word2"), t(3, "Word3"), t(-1, "Another"), t(4, "word4")],L).
L = [t(1, "word1"), t(2, "Word2 Word3 Another"), t(4, "word4")].