假设你有这样一个Prolog术语 "city(伦敦,英格兰)"。即伦敦是英格兰的一个城市。
在Erlang中,如何表示它,使用模式匹配?
在Erlang中,如何表示它,使用模式匹配?
在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.
再次强调,没有一种好的方式可以将任何Prolog翻译成Erlang。早期版本的Erlang是用Prolog编写的,但语义并不相同。如果您有兴趣,可以查看由Robert Virding编写的Erlog,它是为Erlang编写的Prolog。
Erlog
在 R14A 上编译没有问题,似乎也可以正常运行。 - rvirdingcity("London", "England") -> true;
city(_, _) -> false.
或者
city("London") -> "England";
city(_) -> "".