2012-04-09 31 views
0

具有可變更換學期我在序言一DCG,我可以查詢,像這樣:在序言

q(Tree, [name, of, company], []).

,並獲取顯示我分析查詢所採取的路徑的響應:

Tree = q(['company (Class)', 'name (Attribute)'])

現在我想提出一個查詢,如:

q(Tree, [name, of, acme], []).

,並沒有相匹配的長期acme,我想創建一個變量Acme讓我得到的東西,如:

 
Acme = company 
Tree = q(['company (Class)', 'name (Attribute)']) 

我使用SWI-Prolog的和我從另一種語言查詢它,那就是爲什麼查詢全部爲小寫。我的另一種選擇是創建一個所有有效條款的詞典,並用變量替換查詢中的所有unknows,但希望獲得Prolog解決方案。

謝謝。

+1

我不知道,我明白你的問題,但可能是你可以重複查詢嘗試,如下所示:q(Tree,[name,of,acme],[]); q(樹,[名稱,| X],[]); q(Tree,[name | X],[]); q(樹,X,[])並在你得到答案後立即停止? – 2012-04-10 06:13:29

+0

@AlexanderSerebrenik將工作!現在我只需要限制X列表大小,因爲我還可以執行諸如「公司部門名稱」之類的查詢。 – Radek 2012-04-10 07:08:40

+0

我會把它寫成一個答案,因爲否則就不能包含代碼片段。 – 2012-04-10 11:31:43

回答

1

我是否正確理解您需要所有基於前綴的列表?願意爲你下面的工作:

1 ?- p([name,of,company],L). 
L = [name, of, company] ; 
L = [name, of|_G456] ; 
L = [name|_G453] ; 
true. 

2 ?- p([name,of,department,of,company],M). 
M = [name, of, department, of, company] ; 
M = [name, of, department, of|_G551] ; 
M = [name, of, department|_G548] ; 
M = [name, of|_G545] ; 
M = [name|_G542] ; 
true. 

如果這是預期的行爲,然後實現它的代碼可以

p([],[]). 
p([X|Xs],[X|Ys]) :- p(Xs,Ys). 
p([_|_],_). 
+0

這正是我要找的,謝謝@亞歷山大! – Radek 2012-04-10 20:44:49