2016-10-11 67 views
2

之前嘗試過,但對我來說仍然是一團糟。認爲這是最長的後繼,但實際上並非如此。所以寫更好的例子。我正在嘗試編寫一個Prolog謂詞來比較兩個字符串,以查看它們是否具有相同的元素並將它們打印出來(每個成員只能打印一次)。目前我已經寫了這個以將字符串分成兩個不同的列表以便於檢查:Prolog中兩個字符串的交集

但是,我無法找到正確的方法來比較這兩個列表中的每個元素,無論它們在哪裏。我找到了比較方法,直到它找到一個,它返回true,但我需要它來比較兩個列表中的每個元素並輸出它們。我知道這與頭和做比較,然後添加下一個第一個名單成員作爲新的頭等,但我不知道一個辦法做到這一點。此外,交點還是做我所需要的,但它給了我每一個元素(甚至多重時間)。我需要它在找到匹配元素後停下來,以便它只發現一次。

plates(X,Y,Mem,Num):- 
    atom_chars(X,Xs), 
    atom_chars(Y,Ys), 
    compare_list(Xs,Ys,Mem), 
    length(Mem,Num). 

compare_list([], _, []).  
compare_list([H1|T1], L, R) :- 
    (check_element(H1, L) 
    ->R = [H1|R] 
    ;R = R 
    ), 
    compare_list(T1, L, R). 

check_element(_, []). 
check_element(X, [H|T]) :- 
    X = H, 
    check_element(X, T). 

例1:

?-plates('111AXB','112XXX', Mem, Num). 

應該輸出:

Mem = ['1','1','X'], 
Num = 3. 

例2:

?-plates('456XYZ','678ABC', Mem, Num). 

應該輸出:

Mem = ['6'], 
Num = 1. 

我想在這裏實現解決方案: PROLOG Comparing 2 lists

我的測試:

?- plates('ABC123','123ABC',Mem,Num). 

我的輸出:

Mem = [], 
Num = 0. 

預期:

Mem = ['A', 'B', 'C', '1', '2', '3'], 
Num = 6. 

但我無法得到它的工作我想它...... 任何幫助將是非常讚賞的方式!

+0

隨着期望的輸出,還可以添加代碼的輸出 –

+0

所以在最後一個例子,什麼是你所期望的輸出? – 2016-10-11 04:01:46

+0

添加了示例 – Alsar

回答

0

你可以寫類似:

plates(X,Y,Mem,Num):- 
    atom_chars(X,Xs), 
    atom_chars(Y,Ys), 
    inter(Xs,Ys,Mem), 
    length(Mem,Num),!. 

inter(_,[],[]). 
inter([],_,[]). 
inter([H|T],L,[H|T1]):- 
      member(H,L), 
      delete(H,L,L1), 
      inter(T,L1,T1). 
inter([H|T],L,List):- \+member(H,L),inter(T,L,List).   

delete(H,[H|T],T). 
delete(H,[X|T1],[X|T]):-dif(H,X),delete(H,T1,T). 

凡間找到交集和如果發生第二次第一列表的元素檢查,然後將其添加到第三個列表,並從second.Some例子中刪除:

?- plates('112XXX','111AXB', Mem, Num). 
Mem = ['1', '1', 'X'], 
Num = 3. 

?- plates('111AXB','112XXX', Mem, Num). 
Mem = ['1', '1', 'X'], 
Num = 3. 

?- plates('456XYZ','678ABC', Mem, Num). 
Mem = ['6'], 
Num = 1. 

?- plates('ABC123','123ABC',Mem,Num). 
Mem = ['A', 'B', 'C', '1', '2', '3'], 
Num = 6. 

?- plates('123ABC','345DEF',Mem,Num). 
Mem = ['3'], 
Num = 1. 
+0

這是一個我沒有想到的邏輯思想。非常感謝你! – Alsar

+0

很高興幫助! – coder