使用字符列表的模式匹配
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
的第四个字符。
我在模式匹配转换为字符列表的单词时遇到困难:
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
的第四个字符。