2013-04-25 48 views
0

我有一個術語,我想從中獲取一組變量名稱。SWI prolog使用rbtrees或其他方法設置變量名稱的集合

例如,輸入:my_m(aa,b,B,C,max(D,C),D) 輸出:[B,C,D](不需要按輸入順序排序) set_variable_name(Input,Output)。)

我可以簡單地從輸入中得到[B,C,D,C,D],但不知道如何實現set(輸出中只有一個外觀)。我試着像在rbtrees存儲但失敗,因爲

only_one([],T,T) :- !. 
only_one([X|XS],B,C) :- rb_in(X,X,B), !, only_one(XS,B,C). 
only_one([X|XS],B,C) :- rb_insert(B,X,X,U), only_one(XS,U,C). 

它只有一個節點,統一像B=C, C=D...返回樹。我想我知道爲什麼 - 因爲在質疑rb_in(..)時統一了X.

那麼,如何只存儲一次該變量的名稱?或者,這是從根本上錯誤的想法,因爲我們正在使用邏輯編程?如果你想知道爲什麼我需要這個,那是因爲我們被要求在Prolog中實現A *算法,這是製作搜索空間的一部分。

回答

2

您可以使用sort/2,這也可以刪除重複項。

+0

但我想存儲變量的名稱。你是不是這個意思? 'c([],[]): - !。 ([A,B,C,A])(c [X | XS],C):-c(XS,A),append(X,A,D),sort(D,C) ,R)。 ?我想得到R = [A,B,C]。 – Ell 2013-04-25 14:00:08

+0

內置謂詞'sort/2'就是這樣做的。嘗試'? - sort([A,B,C,A],Vs).'。 – mat 2013-04-25 14:14:46

+0

你有我的感謝和我的抱歉!有用。我想嘗試一些東西,如果不加入,因爲這樣可能會有多個附加,然後排序。有沒有其他的方法? – Ell 2013-04-25 14:50:00