带有规则和查询的 Prolog 示例
Prolog example with rules and query
我是 Prolog 的初学者,确实需要用 Prolog 最简单的语法解决这个问题。
我在 Prolog 中有类似于 2 table 的不同产品信息,如下所示:
product(id,company,value).
prod(prodid,date,color).
知识库是这样的:
TABLE 1:
product(aa11zx, alfa, 1230).
product(bb22yz, beta, 5890).
product(cc11zx, alfa, 600).
product(dd22kx, beta, 730).
product(aa22vx, delta, 800).
TABLE 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个table的第一个参数是相同的,但是我需要解决两个问题:
1st:我需要一个规则,以便它理解 table 1 中 "id" 中的前 4 个字符与 [=41] 中 "prodid" 中的 4 个字符相同=] 2.
第二:我需要一个规则/问题,系统可以通过他们的 "product id" 加入 2 tables 就像它可以在 Excel 和 "vlookup" 中一样例如。
例如,连接 table 的最后一行应该是:
product2(aa11, alfa, 1230,1-2-2015, red).
谁能帮帮我?
当然,'simplest syntax possible' 是一个有趣的请求...那么
product2(Key, Desc, Val, D-M-Y, Color) :-
product(PKey, Desc, Val),
sub_atom(PKey, 0,4,_, Key), % maybe: sub_atom(PKey, _,_,_, Key)
prod(Key, D-M-Y, Color).
sub_atom/5 在此处进行了描述...请注意,它区分大小写 - 因此,如果您必须处理此问题,则有可能使两者的大小写相同。当涉及到大表时,最好避免每次都重复...
product2(Key, Desc, Val, D-M-Y, Color) :-
product(PKey, Desc, Val),
upcase_atom(PKey, UPKey),
prod(Key, D-M-Y, Color),
upcase_atom(Key, UKey),
sub_atom(UPKey, 0,4,_, UKey).
注意 sub_atom 谓词在规则中的不同位置,当 prod/3 很大时,第一种情况比第二种情况有更好的性能,因为它可以从参数索引中获益。 .. Prolog数据库其实比DB引擎简单多了....
如果 table 设计实际上是可以更改的,那么将数据库重新设计成这样可能会更好:
product_x_company_value(P, X, C, V).
product_date_color(P, D, C).
一件事是命名你的 table 事实:因为你没有 table 定义语法,例如 SQL,事实名称是一个很好的地方描述列包含的内容。然后,在 table 之间保持 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. See also 的谓词之一收集所有行,作为如何查询和报告的示例。
PS。 也指出,Prolog 数据库不是真正的关系数据库:列顺序很重要,索引默认只在第一个参数上,等等。有办法规避这些限制,但你需要考虑你的用例。对于目前的问题,这可能是一个足够好的答案。
我是 Prolog 的初学者,确实需要用 Prolog 最简单的语法解决这个问题。
我在 Prolog 中有类似于 2 table 的不同产品信息,如下所示:
product(id,company,value).
prod(prodid,date,color).
知识库是这样的:
TABLE 1:
product(aa11zx, alfa, 1230).
product(bb22yz, beta, 5890).
product(cc11zx, alfa, 600).
product(dd22kx, beta, 730).
product(aa22vx, delta, 800).
TABLE 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个table的第一个参数是相同的,但是我需要解决两个问题:
1st:我需要一个规则,以便它理解 table 1 中 "id" 中的前 4 个字符与 [=41] 中 "prodid" 中的 4 个字符相同=] 2.
第二:我需要一个规则/问题,系统可以通过他们的 "product id" 加入 2 tables 就像它可以在 Excel 和 "vlookup" 中一样例如。
例如,连接 table 的最后一行应该是:
product2(aa11, alfa, 1230,1-2-2015, red).
谁能帮帮我?
当然,'simplest syntax possible' 是一个有趣的请求...那么
product2(Key, Desc, Val, D-M-Y, Color) :-
product(PKey, Desc, Val),
sub_atom(PKey, 0,4,_, Key), % maybe: sub_atom(PKey, _,_,_, Key)
prod(Key, D-M-Y, Color).
sub_atom/5 在此处进行了描述...请注意,它区分大小写 - 因此,如果您必须处理此问题,则有可能使两者的大小写相同。当涉及到大表时,最好避免每次都重复...
product2(Key, Desc, Val, D-M-Y, Color) :-
product(PKey, Desc, Val),
upcase_atom(PKey, UPKey),
prod(Key, D-M-Y, Color),
upcase_atom(Key, UKey),
sub_atom(UPKey, 0,4,_, UKey).
注意 sub_atom 谓词在规则中的不同位置,当 prod/3 很大时,第一种情况比第二种情况有更好的性能,因为它可以从参数索引中获益。 .. Prolog数据库其实比DB引擎简单多了....
如果 table 设计实际上是可以更改的,那么将数据库重新设计成这样可能会更好:
product_x_company_value(P, X, C, V).
product_date_color(P, D, C).
一件事是命名你的 table 事实:因为你没有 table 定义语法,例如 SQL,事实名称是一个很好的地方描述列包含的内容。然后,在 table 之间保持 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. See also
PS。