1

私はこれをしばらく使っています。私は、リスト内の要素のすべての出現を削除するための典型的なプロローグ演習の解決策に到達しました...しかし、リスト内にリストがある場合にそれらを削除する方法を見つけようとしています。

これは私が持ってきた遠いものです:

delete(X, Y, Lres) :- 
delete(X, Y, [], Lres).

delete([], Y, Ac, Lres):-
Lres = Ac.

delete([H|T], Y, Ac, Lres):-
is_list(H),
delete(H, Y, Ac, Lres),
delete(T, Y, Lres, Lres).

delete([H|T], Y, Ac, Lres):-
H = Y,
delete(T, Y, Ac, Lres).

delete([H|T], Y, Ac, Lres):-
delete(T, Y, [H|Ac], Lres).

この呼び出しを行う:

[trace] 23 ?- delete([1, 2, [3, 1,3], 4, 5, 3], 2, LRes).

これで失敗します:

Call: (13) delete([], 2, [3, 5, 4, 3, 1, 3, 1], [3, 1, 3, 1]) ? creep
Call: (14) [3, 1, 3, 1]=[3, 5, 4, 3, 1, 3, 1] ? creep
Fail: (14) [3, 1, 3, 1]=[3, 5, 4, 3, 1, 3, 1] ? 

プロローグの変数の値を変更する方法はありますか?

私は自分自身を説明します:

私がこれを書いたとき:

delete([], Y, Ac, Lres):-
Lres = Ac.

Lresの値はAcに置き換えられると思いましたが、実際にはLresとAcを比較していますが、これは誤りですが、Lresが空のときになぜ機能するのかわかりません。同じ呼び出しから、ここにその場合のトレースがあります:

Call: (13) delete([], 2, [3, 1, 3, 1], _G1276) ? creep
Call: (14) _G1276=[3, 1, 3, 1] ? creep
Exit: (14) [3, 1, 3, 1]=[3, 1, 3, 1] ? creep

私はこれについてしばらく考えていましたが、これを行う他の方法はありません!

4

1 に答える 1

2

あなたは必要以上に複雑なことをしていると思います:なぜあなたは追加の議論を導入するのですか?単純なマッチングは、単純な解決策につながるようです。

delete([], _, []).
delete([E|Es], E, Rs) :-
    !, delete(Es, E, Rs).
delete([L|Es], E, [D|Rs]) :-
    is_list(L),
    !, delete(L, E, D),
    delete(Es, E, Rs).
delete([N|Es], E, [N|Rs]) :-
    delete(Es, E, Rs).

そしてこれは

?- delete([1, 2, [3, 1, 2, 3], 4, 5, 3], 2, LRes).
LRes = [1, [3, 1, 3], 4, 5, 3].
于 2013-03-10T20:15:38.760 に答える