2011-11-11 16 views
5

Olası Çoğalt:
Prolog delete: doesn't delete all elements that unify with ElementProlog'da birleşme olmadan bir liste tüm üyelerini silme

Prolog'da

bu yazarsanız:

delete([(1,1),(1,2),(1,1),(3,4)],(1,_),L). 

sonuç olacaktır:

_ Değişken birinci elemanın içinde 1 ile bağlanır ve (1,1) diğer elemanları arar ve siler çünkü normal ne

.

oluyor ve formun tüm üyelerini silmesini bu birleşmeyi önlemek için bir yol var mı (1, _). Bu durumda sonuç şu şekilde olmalıdır: L = [(3, 4)].

cevap

3
delete_pattern([], _, []). 
delete_pattern([H|T], P, O) :- 
    ( H \= P 
    -> O = [H|O1], 
     delete_pattern(T, P, O1) 
    ; delete_pattern(T, P, O)). 

Sen ==/2 veya [email protected]=/2 olarak biraz farklı semantik neden olacaktır filtreleme için diğer yüklemler kullanmak isteyebilirsiniz. İşte

+0

Works, ancak liste öğelerinin yetersiz anda örneği ise sonları 'delete_pattern/3 'çalıştırılır: Burada tartışılan önceki sürümleri çok daha zor muhakeme yapar gerçek örnekleme bağlı olduğunu unutmayın. – repeat

3

bir başka versiyonudur. Aslında, tek saf:

list_el_deleted([], _, []). 
list_el_deleted([X|Xs], X, Ys) :- 
    list_el_deleted(Xs, X, Ys). 
list_el_deleted([X|Xs], E, [X|Ys]) :- 
    dif(X,E), 
    list_el_deleted(Xs, E, Ys). 

Sorgunuzun üzerinde çalışılıyor senin sorunun açıklamada belirsizlik fiili kaynaklarını gösterir:

?- list_el_deleted([(1,1),(1,2),(1,1),(3,4)],(1,X),L). 
X = 1, 
L = [ (1, 2), (3, 4)] ; 
X = 2, 
L = [ (1, 1), (1, 1), (3, 4)] ; 
L = [ (1, 1), (1, 2), (1, 1), (3, 4)], 
dif(X, 1), 
dif(X, 2), 
dif(X, 1). 

Yani her şey gerçekte ne X bağlıdır: 1, 2, veya başka bir şey. prensipte

?- delete([a],X, Xs), X = c. 
false. 

?- X = c, delete([a],X, Xs). 
X = c, 
Xs = [a]. 
+1

@repeat: [burada] çözüm koyun (http://stackoverflow.com/questions/8100586/prolog-delete-doesnt-delete-all-elements-that-unify-with-element#). – false

İlgili konular