Prolog术语到Erlang的转换

4
假设你有这样一个Prolog术语 "city(伦敦,英格兰)"。即伦敦是英格兰的一个城市。
在Erlang中,如何表示它,使用模式匹配?

2
http://github.com/rvirding/erlog - Christian
2个回答

4
除了语法和一些运算符之外,Erlang和Prolog之间没有简单的映射关系。它们是完全不同的语言。你不能从Prolog中做太多事情,也没有好的方法来做你所要求的事情;它们都很糟糕。尽管如此,以下是可能使用这些糟糕方法实现的内容。

在Prolog中,city(London, England)可以创建城市和国家之间的关系,但在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 Comprehensionssofs(Sets Of Sets)模块进行操作。

再次强调,没有一种好的方式可以将任何Prolog翻译成Erlang。早期版本的Erlang是用Prolog编写的,但语义并不相同。如果您有兴趣,可以查看由Robert Virding编写的Erlog,它是为Erlang编写的Prolog。


Erlog 在 R14A 上编译没有问题,似乎也可以正常运行。 - rvirding

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

或者

city("London") -> "England";
city(_) -> "".

备选项之间缺少分号? - Koistinen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接