1

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

我用一个实际的例子来解释我必须做什么:

谓词必须在具有以下形式的列表上工作:

TokenList =[t(1, "word1"), t(2, "Word2"), t(3, "Word3"), t(4, "word4")]

这是令牌列表。对我来说,令牌类似于:t(1, "word1")所以令牌有一个“函子” t 并且其中有两个参数:一个数字(不一定是渐进的,在某些情况下我认为这个值可以是-1) 和一个代表单词的字符串。

如您所见,某些单词的第一个字母是大写的(在本例中是第二个和第三个标记)

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

例如,必须将 preious 令牌列表转换为:

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]):具有第一个标记的编号的标记,内容是第一个标记的单词后跟第二个标记的单词)如果 String1 和 String2 展位以大写字符开头为 TRUE,则创建一个 **NewString,它是 String1 和 String2 的连接,然后创建NewToken放在我的结果的头部列表)。最后递归调用自己

然后我创建了另一个规则,当这不是真的有两个连续标签的内容词都以大写字符开头时应用

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

4

1 回答 1

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")].
于 2013-05-31T21:17:34.790 回答