首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Prolog中的列表中删除谓词

从Prolog中的列表中删除谓词
EN

Stack Overflow用户
提问于 2012-04-06 17:36:17
回答 4查看 632关注 0票数 0

我想从列表中删除所有名为a的谓词。结果必须如下所示:

代码语言:javascript
复制
?- delete_all(a(_), [a(1),a(2),a(3),b(1)], R).
R = [b(1)]

请不要为我提供内置的SWI或其他解决方案,因为代码必须在Amzi-Prolog。

谢谢。

编辑:我已经尝试了以下代码,但它只对原子正常工作:

代码语言:javascript
复制
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)]

这不是真的:(

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-06 18:19:19

使用findall

代码语言:javascript
复制
findall(X, (member(X,[a(1),a(2),a(3),b(1)]),\+(X=a(_))) ,V).
票数 2
EN

Stack Overflow用户

发布于 2012-04-06 18:53:36

我知道你说不能用swi-prolog。然而,这是一项简单的任务(与主要任务相比),实现一个与所使用的exclude/3相同的递归,其余的应该是ISO prolog或用amzi表示。它使用lambda.pl,这是一个允许更简单的高阶编程的库:

代码语言:javascript
复制
:- [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
EN

Stack Overflow用户

发布于 2012-04-06 19:07:08

稍微修复一下,它应该会起作用:

代码语言:javascript
复制
% 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).

让我们试一试:

代码语言:javascript
复制
?- remove_same_indicator(a(_), [a(1),a(2),a(3),b(1)], R).
R = [b(1)]

与findall解决方案相比,它的优点是不会松散变量。例如,可以这样做:

代码语言:javascript
复制
?- remove_same_indicator(a(_), [a(A),a(B),a(C),b(A)], R).
R = [b(A)]

但是通过findall解决方案,我们得到了:

代码语言:javascript
复制
?- 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10041672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档