我想从列表中删除所有名为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)]这不是真的:(
发布于 2012-04-06 18:19:19
使用findall
findall(X, (member(X,[a(1),a(2),a(3),b(1)]),\+(X=a(_))) ,V).发布于 2012-04-06 18:53:36
我知道你说不能用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。
希望这能有所帮助。
发布于 2012-04-06 19:07:08
稍微修复一下,它应该会起作用:
% 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
https://stackoverflow.com/questions/10041672
复制相似问题