对Erlang的Prolog术语

时间:2010-07-06 14:04:33

标签: erlang prolog

假设你有这个序言“城市(伦敦,英格兰)”。即伦敦是英格兰的一个城市。

你如何在Erlang中表示模式匹配?

2 个答案:

答案 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 Comprehensionssofs(集合集)模块的帮助下对其进行操作。


同样,我再说一遍,没有什么好方法可以将任何Prolog翻译成Erlang。早期版本的Erlang是用Prolog编写的,但语义却不尽相同。如果你有兴趣,你可以看一下Erlog,一个由罗伯特·维尔丁写的Prolog和Erlang。

答案 1 :(得分:3)

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

OR

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