首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog term to Erlang

Prolog term to Erlang
EN

Stack Overflow用户
提问于 2010-07-06 22:04:33
回答 2查看 552关注 0票数 4

假设您有这个prolog术语"city(London,England)“。伦敦是英国的一座城市。

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

EN

回答 2

Stack Overflow用户

发布于 2010-07-07 04:49:57

在Erlang和Prolog之间没有简单的映射。除了语法和一些操作符之外,它们是完全不同的语言。你将无法从Prolog中做很多事情,也没有好的方法来做你所要求的事情;它们都很糟糕。尽管如此,这里有一些糟糕的方法可以做的事情。

city(London, England)在Prolog中创建城市和国家之间的关系时,在Erlang中就没有这样的声明性等价物。要获得某种意义上的等价物,您需要在内存中手动存储关系(列表、ETS表、树或字典等)。

如果您使用类似于{Rel, [Items]}的表示,则可以将当前示例设置为{city, [london, england]}。如果您将它们全部存储在一个列表中,则模式匹配可以简单地

代码语言:javascript
复制
relation(X, [X|Rest]) -> true;
relation(X, [_|Rest]) -> relation(X, Rest);
relation(X, []) -> false.

或者更像是

代码语言:javascript
复制
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,这是Robert Virding为Erlang写的一篇开场白。

票数 4
EN

Stack Overflow用户

发布于 2010-07-06 22:21:32

代码语言:javascript
复制
city("London", "England") -> true;
city(_, _) -> false.

代码语言:javascript
复制
city("London") -> "England";
city(_) -> "".
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3186888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档