假设您有这个prolog术语"city(London,England)“。伦敦是英国的一座城市。
如何在Erlang中表示它,模式匹配?
发布于 2010-07-07 04:49:57
在Erlang和Prolog之间没有简单的映射。除了语法和一些操作符之外,它们是完全不同的语言。你将无法从Prolog中做很多事情,也没有好的方法来做你所要求的事情;它们都很糟糕。尽管如此,这里有一些糟糕的方法可以做的事情。
当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,这是Robert Virding为Erlang写的一篇开场白。
发布于 2010-07-06 22:21:32
city("London", "England") -> true;
city(_, _) -> false.或
city("London") -> "England";
city(_) -> "".https://stackoverflow.com/questions/3186888
复制相似问题