2010-07-06 5 views
4

Disons que vous avez ce terme prolog "ville (Londres, Angleterre)". c'est à dire Londres est une ville en Angleterre.Prolog terme à Erlang

Comment représentez-vous cela dans Erlang, pattern matching?

+2

http://github.com/rvirding/erlog – Christian

Répondre

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

OU

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

Les points-virgules manquent entre les alternatives? – Koistinen

+0

Oups. Fixé maintenant – Mau

4

Il n'y a pas de correspondance simple qui peut être fait entre Erlang et Prolog. Sauf pour la syntaxe et certains opérateurs, ils sont des langages complètement distincts. Vous ne serez pas en mesure de faire beaucoup de Prolog et il n'y a pas de bon moyen de faire ce que vous demandez; ils sucent tous. Néanmoins, voici ce qui pourrait être possible de faire avec les méthodes sucky.


city(London, England) crée une relation entre la ville et le pays Prolog, il n'y a pas équivalent déclaratif en Erlang. Pour obtenir quelque chose d'équivalent, vous devez stocker manuellement les relations en mémoire (listes, table ETS, arbres ou dictionnaires, etc.).

Si vous utilisez une représentation un peu comme {Rel, [Items]}, vous pourriez avoir votre exemple actuel comme {city, [london, england]}. Si vous les stocker dans une liste, correspondance de motif pourrait simplement être

relation(X, [X|Rest]) -> true; 
relation(X, [_|Rest]) -> relation(X, Rest); 
relation(X, []) -> false. 

ou peut-être quelque chose comme

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. 

Bien sûr, cela est inefficace et vous êtes susceptible d'utiliser l'une des structures de données qui existent actuellement à Erlang. Dans le cas de la plupart des structures de données opaques pour le stockage de valeurs-clés (gb_trees, dict, etc.), vous devez utiliser les fonctions qui vous sont données pour jouer et ainsi aucune correspondance de pattern n'est possible.

Le prochain choix pourrait être d'utiliser ETS, une base de données en mémoire pour Erlang. Il utilise une méthode différente pour la correspondance, nommée match specs (ou convertie à partir de fonctions qui utilisent la correspondance de motif avec ets:fun2ms/1.)

Tout ce qui précède n'est pas vraiment utile car il ne vous permet pas d'effectuer des opérations vraiment efficaces sur le relation. Pour obtenir le maximum de fonctionnalités, vous devrez probablement utiliser la théorie des ensembles, modéliser les données vous-même et opérer à l'aide de Query List Comprehensions ou du module sofs (Ensembles de Sets).


Encore une fois, je répète qu'il n'y a vraiment aucun bon moyen de traduire n'importe quel Prolog en Erlang. Les premières versions d'Erlang ont été écrites en Prolog, mais la sémantique n'est tout simplement pas la même. Si vous êtes intéressé, vous pouvez jeter un oeil à Erlog, un Prolog dans et pour Erlang écrit par Robert Virding.

+0

'Erlog' se compile sans problème sur R14A et semble fonctionner correctement. – rvirding

+0

Merci, j'ai mis à jour le texte en fonction de cela. –