2015-09-14 137 views
0

我是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表有第一個參數的共同點,但有2個問題需要解決:

第一:我需要一個規則,以便它能夠理解表1中「id」中的4個第一個字符是與表2中「prodid」中的4個字符相同。

第二:我需要一個規則/問題,系統可以通過他們的「產品ID」連接兩個表,就像它可以在Excel中使用「vlookup」例如。

例如連接表的最後一行應該是:

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

誰能幫助我?

+0

你確定你要設計你的數據庫嗎?確保兩個表中的ID實際上是相同的,並且不必拆分前4個字符是一個好主意。 – 2015-09-14 06:05:39

+0

如果表prod中'prodid'的最後兩個字符總是與同一行相關聯,那麼也可以將它們分離到另一列。 PS。考慮使用更多的描述性表名? – 2015-09-14 06:37:06

回答

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數據庫不是真正的關係數據庫:列順序很重要,索引默認只在第一個參數上,等等。有辦法規避這些限制,但是你需要考慮你的用例。對於這個問題,這可能是一個足夠好的答案。

0
當然

,在「可能的最簡單的語法」是一個有趣的請求......約

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謂詞規則的不同位置,第一種情況下將有更好的表現比第二,當刺/ 3是很大的,因爲它可以有利於參數索引... Prolog數據庫實際上比數據庫引擎簡單得多....