gpt4 book ai didi

erlang - Erlang 的 Prolog 术语

转载 作者:行者123 更新时间:2023-12-02 06:46:26 26 4
gpt4 key购买 nike

假设您有序言术语“city(London, England)”。即伦敦是英格兰的一座城市。

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

最佳答案

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 中的 Prolog。

关于erlang - Erlang 的 Prolog 术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3186888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com