1

これは、特定のリストから要素を削除または削除するためのコードです。

remove_elem(X,[],[]). 
remove_elem(X,L1,L2) :-
   L1 = [H|T],
   X == H,
   remove_elem(X,T,Temp),
   L2 = Temp. 
remove_elem(X,L1,L2) :- 
   L1 = [H|T],
   X \== H, 
   remove_elem(X,T,Temp),
   L2 = [H|Temp].

リストからサブリストのすべての出現を削除できるように、どのように変更できますか?

要素にリストを入れようとすると、要素が一度だけ削除されます。

これは次のようになります。

?- remove([1,2],[1,2,3,4,1,2,5,6,1,2,1],L).   
L = [3,4,5,6,1].                        % expected result
4

3 に答える 3

0

<rant>

私は何年もPrologを研究していますが、それでもいくつかの驚きに値します...リストライブラリを知っていて、特定のモード(例として投稿したものなど)がある場合、問題は非常に簡単に解決できます。しかし、一般化するのも非常に複雑になる可能性があり、@false の提案 (if_/3 とその友人) に基づいて @repeat によって提案されたアプローチが、単純な古い Prolog (a-la Clocksin -メリッシュ、言うまでもなく)。

</rant>

古い学校の Prolog に基づいた、見つけるのがそれほど簡単ではなかった解決策

list_sublist_removed(L, S, R) :-
    append([A, S, B], L),
    S \= [],
    list_sublist_removed(B, S, T),
    append(A, T, R),
    !
    ; L = R.

いくつかのテスト:

?- list_sublist_removed([1,2,3,4,1,2,5,6,1,2,1],[1,2],L).
L = [3, 4, 5, 6, 1].

?- list_sublist_removed([1,2,3,4,1,2,5,6,1,2,1],X,[3, 4, 5, 6, 1]).
X = [1, 2].

?- length(X,_), list_sublist_removed(X,[1,2],[3, 4, 5, 6, 1]).
X = [3, 4, 5, 6, 1] ;
X = [3, 4, 5, 6, 1, 2, 1] ...
于 2015-07-04T13:11:35.663 に答える