从Prolog术语到Erlang

从Prolog术语到Erlang,erlang,prolog,Erlang,Prolog,假设你有一个序言术语“城市(英国伦敦)”。伦敦是英国的一座城市 您如何在Erlang模式匹配中表示这一点 city("London", "England") -> true; city(_, _) -> false. 或 Erlang和Prolog之间没有简单的映射。除了语法和一些运算符,它们是完全不同的语言。你不能从Prolog中做很多事情,也没有好的方法去做你要求的事情;他们都很烂。然而,这里有一些可以用这些糟糕的方法做的事情 当城市(英国伦敦)在Prolog中创建城市和国家

假设你有一个序言术语“城市(英国伦敦)”。伦敦是英国的一座城市

您如何在Erlang模式匹配中表示这一点

city("London", "England") -> true;
city(_, _) -> false.


Erlang和Prolog之间没有简单的映射。除了语法和一些运算符,它们是完全不同的语言。你不能从Prolog中做很多事情,也没有好的方法去做你要求的事情;他们都很烂。然而,这里有一些可以用这些糟糕的方法做的事情


城市(英国伦敦)
在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_树、dict等),您需要使用提供给您的函数进行处理,因此不可能进行模式匹配

下一个选择可能是使用ETS,一个用于Erlang的内存数据库。它使用不同的方法进行匹配,命名为(或从使用模式匹配的函数转换而来)

所有这些都不是很有用,因为它不会让你对关系进行任何真正有效的操作。为了获得最大的功能,您可能必须使用集合论,自己建模数据,并在或(集合集合)模块的帮助下对其进行操作



我要再次重申,将任何Prolog转换为Erlang实际上都没有好的方法。早期版本的Erlang是用Prolog编写的,但语义并不相同。如果您感兴趣,可以看一看Robert Virding编写的Erlang中的和用于Erlang的序言。

备选方案之间缺少分号?
Erlog
在R14A上编译没有问题,并且似乎运行正常。
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.