2017-09-13 10 views
1

要素Xが3回出現するリストLを与えたプログラムを作成したい場合は、その要素を含むNLリストを1回だけ返します。 たとえば、この質問要素の2回目と3回目の削除を削除する

?- erase([1,2,3,1,6,1,7],1,NL). 

NL = [1,2,3,6,7] or NL = [2,3,1,6,7] or NL = [2,3,6,1,7] 

P.S.を返す必要があります 与えられたリストに何も要素が何も含まれていないとします。
これは私のコードですが、質問をするとfalseを返します。それを修正するための提案があれば歓迎されます。

erase([],_,[]). 
erase(L,X,NL):- 
       append(A,[X,B,X,C,X,D],L), 
       append(A,[X,B,C,D],NL). 
+0

何それが4回発生した場合?私たちは '1'だけを探しますか?または、複数回発生するすべての*要素を削除しますか? –

+0

私はPに書いたように、このケースは存在しないと仮定します。 – kindaExcited

+0

私は*アヒルのデバッグ*で始まります:あなたの述語が目的としているものをあなたのラバーダックまたは私たちに伝えます。なぜあなたは 'append/3'をここで使うのですか?なぜこれがこの問題の良いツールだと思いますか? –

答えて

3

ですから、次のクエリが成功する必要があること、言うが、

?- erase([1,2,3,1,6,1,7],1,NL). 
false. 

を失敗しても、次の一般化が失敗した:

?- erase([1,2,3,1,6,1,7],E,NL). 
false. 

私はより容易なアクセスのためにこれを再定式てみましょう:

?- L = [1,2,3,1,6,1,7], erase(L,E,NL). 
false. 

そこで、このリストをさらに一般化する必要があります。この要素を要素で試してみることもできますが、まずは最初に優先します。

?- L = [_,_,_,_,_,_,_], erase(L,E,NL). 
L = [_2528, E, _2540, E, _2552, E, _2564], 
NL = [_2528, E, _2540, _2552, _2564] ; 
false. 

これは唯一の回答です。 Eは第2位、第3位、第5位に正確に現れなければならないことがわかります。それが本当であれば試してみましょう:

?- erase([0,1,0,1,0,1,0],1,NL). 
NL = [0, 1, 0, 0, 0] ; 
false. 

だからあなたのソリューションは、—時々に動作します。あなたがかなり欲しいようだ:複数のリストを処理するときに

erase(L, X, NL) :- 
    phrase(
     (seq(Any1), [X], seq(Any2), [X], seq(Any3), [X], seq(Any4)), L), 
    phrase(
     (seq(Any1),  seq(Any2),  seq(Any3), [X], seq(Any4)), NL). 

seq([]) --> []. 
seq([E|Es]) --> [E], seq(Es). 
+0

ここでいい点は、X要素を配置できる場所であればどこでも動作するはずです。あなたの提案は幸いなことですが、私の仕事もできますか?私は/ 3を追加することを意味する。これまでのご協力ありがとうございました! – kindaExcited

+1

@kindaExcited:それは非常に複雑です:あなたは少なくとも6(6)の「追加/ 3」の目標が必要です – false

+0

ああ、私はそれを即座に拒否します。 – kindaExcited

0

APPEND/2は、多くのことができます:

erase(L,E,R) :- 
    append([A,[E],B,[E],C,[E],D],L), 
    select([E],[X,Y,Z],[[],[]]), 
    append([A, X, B, Y, C, Z, D],R). 
関連する問題