簡體   English   中英

帶有規則和查詢的Prolog示例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM