0

リストから指定されたすべての述語を削除したいa。結果は次のようになります。

?- delete_all(a(_), [a(1),a(2),a(3),b(1)], R).
R = [b(1)]

コードは Amzi-Prolog にある必要があるため、SWI などの組み込みソリューションを提供しないでください。

ありがとう。

編集:次のコードを試しましたが、アトムに対してのみ適切に機能しています:

remove_all(X,[],[]).
remove_all(X,[X|L],R):-remove_all(X,L,R).
remove_all(X,[Y|L],R):-not(X=Y), remove_all(X,L,M), R=[Y|M].

?-remove_all(a(_), [a(1),a(2),a(3),b(1)], R).
R=[a(2),a(3),b(1)]

これは真実ではありません:(

4

4 に答える 4

2

findall を使用する

findall(X, (member(X,[a(1),a(2),a(3),b(1)]),\+(X=a(_))) ,V).
于 2012-04-06T10:19:18.757 に答える
2

あなたがswi-prologを言わなかったのは知っています。ただし、(メインのタスクと比較して)簡単なタスクです。使用されているのと同じように動作する再帰を実装するにはexclude/3、残りは ISO プロローグにするか、amzi にも存在する必要があります。これは、より簡単な高次プログラミングを可能にするライブラリであるlambda.plを使用します。

:- [lambda].
filter(Term, List, Result) :-
    Term =.. [Pred|Args],
    length(Args, Arity),
    exclude(\X^(X =.. [Pred2|Args2],
                length(Args2, Arity2),
                Pred == Pred2,
                Arity == Arity2), List, Result).

このソリューションには、不純なものを避けるという利点がありfindall/3ます。

お役に立てれば。

于 2012-04-06T10:53:35.710 に答える
1

少し修正しましたが、うまくいくはずです:

% remove_same_indicator(+Callable,+List,-List)
remove_same_indicator(_, [], []).
remove_same_indicator(X, [Y|L], R) :- 
       functor(X, F, N), 
       functor(Y, F, N), 
       !, 
       remove_same_indicator(X, L, R).
remove_same_indicator(X, [Y|L], [Y|R]) :- 
       remove_same_indicator(X, L, R).

やるだけやってみよう:

?- remove_same_indicator(a(_), [a(1),a(2),a(3),b(1)], R).
R = [b(1)]

findall ソリューションよりも優れているため、変数を失うことはありません。たとえば、次のことができます。

?- remove_same_indicator(a(_), [a(A),a(B),a(C),b(A)], R).
R = [b(A)]

しかし、findall ソリューションを使用すると、次のようになります。

?- L=[a(A),a(B),a(C),b(A)], findall(X, (member(X,L),\+ (X = a(_))), R).
L = [a(A), a(B), a(C), b(A)],
R = [b(_I)]

findall はコピーを作成し、新しい変数を作成するため、b の引数は A にバインドされなくなりました。

さよなら

functor/3 は ISO であり、Amzi でもあります!
http://www.amzi.com/manuals/amzi/pro/ref_manipulating_terms.htm#functorTermFunctorN

于 2012-04-06T11:07:07.593 に答える
0
remove_all(_, [], []).
remove_all(X, [Y|R], L):- \+ X \= Y, remove_all(X, R, L).
remove_all(X, [Y|R], [Y|R2]):- X \= Y, remove_all(X, R2, L).
于 2012-04-06T21:21:36.293 に答える