【发布时间】:2017-02-27 17:05:25
【问题描述】:
我想在 Prolog 中实现某种“数据库”。
我对表格和行建模有两个想法:
% 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).
例如,对于这两个模型,我可以为具有正数的客户分别制作一个“SELECT ID FROM client WHERE amount > 0”:
% 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).
它们都有相同的输出;
?- client1_positive(Clients).
Client = ['B069'].
?- client2_positive(Clients).
Client = ['B069'].
但这是我的问题,因为我对 Prolog 很陌生,所以我完全不知道如何使这种动态化,例如“SELECT name FROM client WHERE ID = 'B069'”。我可以为这个特定的 SQL 查询实现一个规则,但我找不到一种方法来实现一个更抽象的规则,以便可以解释每个查询。
对于如何在 Prolog 中对此类数据进行建模,是否有最佳实践?还有一些关于如何在 Prolog 中使请求更抽象的想法(不是对我问题的详细回答)?
非常感谢
【问题讨论】:
-
没有必要过早使用
findall。只依赖非确定性/回溯并尽可能晚地执行findall(或bagof或setof)。这样您的谓词/规则将自动组合。findall有点像对通常延迟回溯的计算的早期强制评估。