我想从列表中删除名为a
的所有谓词。结果必须如下所示:
?- delete_all(a(_), [a(1),a(2),a(3),b(1)], R).
R = [b(1)]
请不要向我提供SWI或其他人的内置解决方案,因为代码必须在Amzi-Prolog中。
感谢。
编辑:我已经尝试了以下代码,但它只适用于原子:
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)]
这不是真的:(
答案 0 :(得分:2)
使用findall
findall(X, (member(X,[a(1),a(2),a(3),b(1)]),\+(X=a(_))) ,V).
答案 1 :(得分:2)
我知道你说没有swi-prolog。然而,这是一个简单的任务(与主要的相比),实现一个与使用的exclude/3
行为相同的递归,其余的应该是ISO prolog或也存在于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
。
希望这有帮助。
答案 2 :(得分: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)]
b的参数不再与A绑定,因为findall 创建副本,从而创建新变量。
再见
functor / 3是ISO,也是Amzi!
http://www.amzi.com/manuals/amzi/pro/ref_manipulating_terms.htm#functorTermFunctorN
答案 3 :(得分: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).