Между Эрлангом и Прологом нет простого сопоставления. За исключением синтаксиса и некоторых операторов, это совершенно разные языки . Вы не сможете сделать многое из Пролога, и нет хорошего способа сделать то, что вы просите; все они сосут . Тем не менее, вот что можно было бы сделать с помощью отстойных методов.
Если city(London, England)
создает отношения между городом и страной в Прологе, в Эрланге нет такого декларативного эквивалента. Чтобы получить что-то эквивалентное, вам нужно будет вручную хранить отношения в памяти (списки, таблицы 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. Для сопоставления используется другой метод, называемый спецификации совпадения (или преобразованный из функций, использующих сопоставление с шаблоном с ets: fun2ms / 1 .)
Все вышеперечисленное не очень полезно, потому что оно не позволит вам делать какие-либо действительно эффективные операции над отношениями. Чтобы получить максимальную функциональность, вам, вероятно, придется использовать теорию множеств, самостоятельно моделировать данные и работать с ними с помощью Понимания списка запросов или sofs (Наборы наборов). модуль.
Опять же, я повторюсь, что на самом деле нет хорошего способа перевести Пролог на Эрланг. Ранние версии Erlang были написаны на Прологе, но семантика просто не та. Если вам интересно, вы можете взглянуть на Erlog , Пролог в и для Эрланга, написанный Робертом Вирдингом.