Je voudrais implémenter une sorte de "base de données" dans Prolog.Implémenter des bases de données dans prolog
J'ai deux idées pour modéliser des tables et des rangs:
% First one
client('B069','Laurent','769, rue de la LALALA','LLN','A1',10000).
% Second one
data(client,'B069',name,'Laurent').
data(client,'B069',adress,'69, rue de la LALALA').
data(client,'B069',town,'LLN').
data(client,'B069',cat,'A1').
data(client,'B069',amount,10000).
Avec les deux modèles que je peux par exemple faire respectivement un « SELECT ID du client WHERE quantité> 0 » pour le client avec montant positif:
% First one
client1_positive(Client) :- findall(ID,(data(client,ID,compte,Amount),Amount>0),Client).
% Second one
client2_positive(Client) :- findall(ID,(client(ID,_,_,_,_,Amount),Amount>0),Client).
Ils ont tous deux la même sortie;
?- client1_positive(Clients).
Client = ['B069'].
?- client2_positive(Clients).
Client = ['B069'].
Mais voici mon problème, puisque je suis très nouveau pour Prolog Je ne sais absolument pas comment je peux faire cette dynamique, comme « SELECT nom du client WHERE ID = « B069 » ». Je peux implémenter une règle pour cette requête SQL spécifique mais je ne peux pas trouver un moyen d'implémenter une règle plus abstraite pour que chaque requête puisse être interprétée.
Existe-t-il une meilleure pratique pour modéliser ce type de données dans Prolog? Et quelques idées (pas une réponse détaillée à mon problème) sur la façon de rendre une demande plus abstraite dans Prolog?
Merci beaucoup
Merci qui m'a aidé. Et savez-vous avec ce modèle comment je peux obtenir par exemple le deuxième argument dans le client, une règle comme 'nth_arg (+ Predicate, + Nth, -Argument)'. Est-ce que ce genre de règle existe? – tomatediabolik
@tomatediabolik Dans ce cas, vous connaissez la signification de chaque position d'argument. Quel est le cas d'utilisation pour choisir l'argument par index? Normalement, vous pourriez avoir quelque chose comme 'client_phone (ClientId, Phone): - client (CllientId, _, _, Phone).» Ou quelque chose comme ça. Si vous avez vraiment besoin de le sélectionner par index, vous pouvez utiliser 'arg/3' (' arg (+ Nth, + Term, -Argument) ') qui obtiendra le nième argument d'un terme. Sans plus d'informations sur votre cas d'utilisation, je ne sais pas trop quoi en dire. – lurker