假设你有这个序言“城市(伦敦,英格兰)”。即伦敦是英格兰的一个城市。
你如何在Erlang中表示模式匹配?
答案 0 :(得分:4)
在Erlang和Prolog之间没有简单的映射。除了语法和一些运算符,它们是完全不同的语言。你将无法从Prolog那里做很多事情而且没有好办法去做你所要求的事情。他们都吮吸。然而,这里有可能与sucky方法有关。
city(London, England)
在Prolog中创建城市与国家之间的关系,在Erlang中没有这样的声明等价物。要获得某种程度上相同的东西,您需要在内存中手动存储关系(列表,ETS表,树或字典等)。
如果您使用类似{Rel, [Items]}
的表示形式,则可以将当前示例设为{city, [london, england]}
。如果将它们全部存储在列表中,则模式匹配可能只是
relation(X, [X|Rest]) -> true;
relation(X, [_|Rest]) -> relation(X, Rest);
relation(X, []) -> false.
或者更像是
main() ->
Relations = [{london, england},
{montreal, canada},
{oxford, england}],
same_country(Relations, london, oxford).
same_country(Relations, City1, City2) ->
{_, Country1} = lists:keyfind(City1, 1, Relations),
{_, Country2} = lists:keyfind(City2, 1, Relations),
COuntry1 == Country2.
当然这是低效的,您可能会使用Erlang中当前存在的数据结构之一。对于键值存储的大多数不透明数据结构(gb_trees,dict等),您需要使用给定的函数来进行游戏,因此不可能进行模式匹配。
下一个选择可能是使用ETS,一个Erlang的内存数据库。它使用不同的匹配方法,名为match specs(或从使用与ets:fun2ms/1模式匹配的函数转换而来。)
以上所有内容都不是很有用,因为它不会让你对关系做任何真正有效的操作。要获得最多功能,您可能必须使用集合论,自行建模数据并在Query List Comprehensions或sofs(集合集)模块的帮助下对其进行操作。
同样,我再说一遍,没有什么好方法可以将任何Prolog翻译成Erlang。早期版本的Erlang是用Prolog编写的,但语义却不尽相同。如果你有兴趣,你可以看一下Erlog,一个由罗伯特·维尔丁写的Prolog和Erlang。
答案 1 :(得分:3)
city("London", "England") -> true;
city(_, _) -> false.
OR
city("London") -> "England";
city(_) -> "".