2012-12-19 38 views
3

我正在接受兩個集合的函數並返回它們的交集。但是,我不想在我的代碼中使用成員函數。這裏的成員函數:在序言中不使用成員函數查找兩個集合的交集

member(X, [ X | T ]). 
member(X, [ _ | T ]) :- member(X, T). 

這是我到目前爲止有:

 set_int(_,[],_). 
    set_int([H|T],[H|T1],[H|T2]) :- 
      set_int(T,T1,T2). 
    set_int(T,[X|T1],T2) :- 
      set_int(T,T1,T2). 

請幫我看看我的邏輯。

回答

0

我認爲你可以處理成員(或等效)只有如果你的套件是訂購。有了這樣的假設,我們可以比較正題:

set_int([X|Xs], [Y|Ys], Is) :- 
    X @< Y, 
    !, set_int(Xs, [Y|Ys], Is). 
set_int([X|Xs], [Y|Ys], Is) :- 
    X @> Y, 
    !, set_int([X|Xs], Ys, Is). 
set_int([Z|Xs], [Z|Ys], [Z|Is]) :- 
    !, set_int(Xs, Ys, Is). 
set_int(_, _, []). 
1

如果你寫set_int處理三種情況:第一項(空列表,一個元素的列表,並列出都比較長),可以有效地在member(A, B)位置使用set_int([A], B, [A])

相關問題