使用字符列表的模式匹配

Pattern matching using list of characters

我在模式匹配转换为字符列表的单词时遇到困难:

wordworm(H1,H2,H3,V1,V2) :-
    word(H1), string_length(H1,7), 
    word(H2), string_length(H2,5),
    word(H3), string_length(H3,4),
    word(V1), string_length(V1,4), 
       word(H3) \= word(V1),
       atom_chars(H2, [_,_,Y,_,_]) = atom_chars(V1, [_,_,_,Y]),
    word(V2), string_length(V2,5), 
       word(H2) \= word(V2),
       atom_chars(H3, [_,_,_,Y]) = atom_chars(V2, [_,_,_,_,Y]).

在本节上方,我有一系列 600 个单词的格式,word("prolog")。代码运行良好,没有 atom_chars,但有了它,我得到一个 time-out 错误。谁能为我推荐一种更好的代码结构方式?

Prolog 谓词调用不同于其他语言中的函数调用。他们没有有“return值”。

当您写 X = atom_chars(foo, Chars) 时,不会 执行 atom_chars。它构建了一个 数据结构 atom_chars(foo, Chars)。它不会“调用”这个数据结构。

如果你想在某个原子 H2 上计算 atom_chars 然后对结果列表说点什么,可以这样称呼它:

atom_chars(H2, H2Chars),
H2Chars = [_,_,Y,_,_]

总的来说,也许您的代码应该更像这样:

...,
atom_chars(H2, H2Chars),
H2Chars = [_,_,Y,_,_],
atom_chars(V1, V1Chars),
V1Chars = [_,_,_,Y],
...

请注意,您无需断言这些 atom_chars 目标之间存在某种“平等”。它们的字符列表共享同一个变量 Y 的事实意味着会有一个连接: H2 的第三个字符必须等于 V1 的第四个字符。