2011-02-17 60 views
1

這裏是我的問題(舉例,因爲這是更快):Prolog的列表操作

?- enum_list([alpha, beta, gamma, beta, beta, delta, epsilon, alpha], L). 
L = [alpha1, beta1, gamma, beta2, beta3, delta, epsilon, alpha2]. 

問題很簡單,當我允許重新排序列表中(只是對列表進行排序,相同組元素融入清單,枚舉了列出它們是否長於1)。但我想保留這個訂單。有任何想法嗎?

回答

2

如何:

enum_list(L, E):- 
    enum_list(L, E, [], _). 

enum_list([], [], B, B). 
enum_list([X|Tail], [Y|NTail], B, NB):- 
    select(X-C, B, MB), 
    succ(C, C1), 
    atom_concat(X, C1, Y), 
    !, 
    enum_list(Tail, NTail, [X-C1|MB], NB). 
enum_list([X|Tail], [Y|NTail], B, NB):- 
    enum_list(Tail, NTail, [X-1|B], NB), 
    (member(X-1, NB) -> Y=X ; atom_concat(X, 1, Y)). 

它遍歷列表並保持一個集中的每個項目的出現次數,因此它知道什麼時候和什麼追加對每個項目獲得的名稱。

+0

@sharky。不,這個案例在最後一個條款中已經考慮到了。 ? - enum_list([alpha,beta,gamma,beta,beta,delta,epsilon,alpha],L)。 L = [α1,β1,γ,β2,β3,δ,ε,α2]。 – gusbro 2011-02-18 13:27:44