[英]Prolog example with rules and query
我是Prolog的初學者,確實需要使用Prolog的最簡單語法解決此問題。
我在Prolog中有類似於2個具有不同產品信息的表,如下所示:
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個表的共同點是第一個參數,但是我需要解決兩個問題:
1st:我需要一個規則,以便它可以理解表1中“ id”中的前4個字符與表2中“ prodid”中的4個字符相同。
第二:我需要一個規則/問題,系統可以在這兩個表之間按其“產品ID”將其連接起來,例如可以在Excel中使用“ vlookup”將其連接起來。
例如,聯接表的最后一行應為:
product2(aa11, alfa, 1230,1-2-2015, red).
誰能幫我 ?
當然,“最簡單的語法”是一個有趣的要求...
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引擎簡單得多....
如果您可以實際更改表設計,則最好將數據庫重新設計為如下所示:
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).
您可以使用收集所有解決方案的謂詞之一來收集所有行。 另請參閱此答案以獲取有關如何查詢和報告的示例。
PS。 就像@CapelliC的答案所指出的那樣,Prolog數據庫也不是真正的關系數據庫:列順序很重要,默認情況下僅在第一個參數上建立索引,等等。有許多方法可以規避這些限制,但是您需要考慮自己的用例。 對於目前的問題,這可能是一個足夠好的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.