2016-10-11 11 views
2

これまでに試したことがありますが、まだまだ私のための混乱です。それは最長のサブシーケンスだと思っていましたが、実際はそうではありません。もっと良い例を書いてください。私は2つの文字列を比較して同じ要素を持っているかどうかを確認し、それらを印刷するためにProlog述語を作成しようとしています(メンバーごとに1回のみ)。現在、私は簡単にチェックのための2つの異なるリストに文字列を取得するには、これを書いた:Prologでの2つの文字列の交差

しかし、私は悩み、これら二つのリストに彼らは関係なくすべての要素を比較するための正しい方法を見つけるのを持っています。私はそれが見つかるまで比較する方法を見つけましたが、それは真実を返しますが、両方のリストのすべての要素を比較して出力する必要があります。私はそれが頭と関係していることを知っていると知っているし、次の最初のメンバーを新しい頭などに追加する。しかし、私はそれをやる方法を見つけられない。また、交差点はちょっと必要なことをしますが、それは私にすべての要素を与えます(何回も繰り返します)。一致する要素が見つかったら一度停止する必要があります。

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

を追加し、あなたが期待する出力は何ですか? –

+0

例を追加 – Alsar

答えて

0

次のようなものを書くことができ:

間が交差点を見つけ、最初のリストの要素が第二で発生した場合にチェックすることで、その後、3番目のリストに追加してsecond.Some例から、それを削除します
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). 

:期待される出力とともに

?- 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