带有规则和查询的Prolog示例

时间:2015-09-14 00:57:38

标签: prolog

我是Prolog的初学者,真的需要在Prolog最简单的语法中解决这个问题。

我有类似于2个表,在Prolog中有不同的产品信息,如下所示:

product(id,company,value).
prod(prodid,date,color).

知识数据库是这样的:

表1:

product(aa11zx, alfa, 1230).
product(bb22yz, beta, 5890).
product(cc11zx, alfa, 600).
product(dd22kx, beta, 730).
product(aa22vx, delta, 800).

表2:

prod(aa11, 1-2-2015, red).
prod(aa22, 1-7-2015, green).
prod(dd22, 1-4-2015, blue).
prod(bb22, 1-3-2015, blue).
prod(cc11, 1-3-2015, green).

这两个表有第一个共同的参数,但我需要解决2个问题:

第一:我需要一条规则,以便它能理解" id"中的4个第一个字符。表1中的4个字符与" prodid"中的4个字符相同。在表2中。

第二:我需要一个规则/问题,系统可以通过他们的"产品ID"加入2个表。喜欢它可以在Excel中使用" vlookup"例如。

例如,连接表的最后一行应该是:

product2(aa11, alfa, 1230,1-2-2015, red).

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

如果表格设计是您可以实际更改的,那么将数据库重新设计为以下内容可能会更好:

product_x_company_value(P, X, C, V).
product_date_color(P, D, C).

有一件事是命名您的事实表:例如,由于您没有像SQL中那样具有表定义语法,因此事实名称是描述列包含内容的一个好地方。然后,保持表之间的ID一致使查询更加简单。你的第一个问题不再存在了。加入第一列非常简单:

product_company_value_date_color(P, Comp, V, D, Col) :-
    product_x_company_value(P, _, Comp, V),
    product_date_color(P, D, Col).

您可以使用collecting all solutions的谓词之一收集所有行。另请参阅this answer以获取有关如何查询和报告的示例。

PS。正如answer of @CapelliC指出的那样,Prolog数据库不是真正的关系数据库:列顺序很重要,索引默认只在第一个参数上,等等。有办法规避这些限制,但你需要考虑你的用例。对于现在的问题,这可能是一个很好的答案。