我试图使用递归从列表中删除整数。我制作了这个remove_integers
谓词,无法弄清楚它为什么不起作用。显然我错过了关于Prolog非常重要的事情。
remove_integers([], L, L).
remove_integers([H|T], A, L) :-
\+ integer(H),
remove_integers(T, [A|H], L).
我对这个谓词做了一个跟踪并获得了以下内容:
[trace] ?- remove_integers([foo, bar, 1, 2, foo], [], L).
Call: (7) remove_integers([foo, bar, 1, 2, foo], [], _G8188) ?
Call: (8) integer(foo) ?
Fail: (8) integer(foo) ?
Redo: (7) remove_integers([foo, bar, 1, 2, foo], [], _G8188) ?
Call: (8) remove_integers([bar, 1, 2, foo], [[]|foo], _G8188) ?
Call: (9) integer(bar) ?
Fail: (9) integer(bar) ?
Redo: (8) remove_integers([bar, 1, 2, foo], [[]|foo], _G8188) ?
Call: (9) remove_integers([1, 2, foo], [[[]|foo]|bar], _G8188) ?
Call: (10) integer(1) ?
Exit: (10) integer(1) ?
Fail: (9) remove_integers([1, 2, foo], [[[]|foo]|bar], _G8188) ?
Fail: (8) remove_integers([bar, 1, 2, foo], [[]|foo], _G8188) ?
Fail: (7) remove_integers([foo, bar, 1, 2, foo], [], _G8188) ?
false.
除了中间列表看起来很奇怪[[[]|foo]|bar]
之外,我不明白为什么在某些时候它开始删除已经在累加器中的项目。
答案 0 :(得分:1)
原始解决方案的主要问题是:(1)根本不处理X
是整数的情况,(2)您的调用,remove_integers(T, [A|H], L).
使用元素{{1作为列表的尾部,在此上下文中不正确。你的意思可能是H
。
更正您所拥有的代码:
remove_integers(T, [H|A], L)
但是为什么你在这里使用额外的论点还不清楚。看起来你正在定义一个辅助谓词,但没有定义一个主谓词。此外,这种方法使您可以按相反顺序查看其余元素:
remove_integers([], L, L).
remove_integers([H|T], A, L) :-
integer(H),
remove_integers(T, A, L).
remove_integers([H|T], A, L) :-
\+ integer(H),
remove_integers(T, [H|A], L).
你可以在没有辅助谓词或切割的情况下通过考虑3种情况来做到这一点:(1)基本情况(空列表),(2)当前列表的头部是整数的情况,以及(3)当前列表的头部不是整数的情况:
| ?- remove_integers([a,b,c,3,4,d], [], L).
L = [d,c,b,a] ? ;
no
你也可以使用Prolog“if-then-else”结构:
remove_integers([], []).
remove_integers([X|T], R) :-
integer(X),
remove_integers(T, R).
remove_integers([X|T], [X|R]) :-
\+ integer(X),
remove_integers(T, R).
| ?- remove_integers([a,b,c,3,4,d], L).
L = [a,b,c,d] ? ;
no
| ?-
答案 1 :(得分:0)
我们的问题始终是 CUT!
remove_integers([],[]).
remove_integers([X|Xs],[X|Ys]) :-
\+integer(X),!,
remove_integers(Xs,Ys).
remove_integers([_|Xs],Ys) :-
remove_integers(Xs,Ys).
测试:
| ?- remove_integers([a,b,c,dfg,1,5,m,8,a],L).
L = [a,b,c,dfg,m,a] ? ;
no