所以基本上,我想在prolog中做一个append函数,如果列表的第一个元素不存在,它就会作为头添加到其中,否则它会返回相同的列表
我写的是:
list_append(F,[],[F]).
list_append(F,[X|XS],[F,X|XS]):- not(member(F,[X|XS])),list_append(F,XS,YS).
但当元素存在时,它会重新运行False而不是列表。。。有什么帮助吗?输出:
?- list_append(2,[2,2,3],X).
false.
脉冲方法:
append_if_not_member(Elem, LstBeforeAppend, LstAfterAppend) :-
% Usually perform checks here, e.g. could check that Elem is not a list
append_if_not_member_(Elem, LstBeforeAppend, LstAfterAppend).
append_if_not_member_(Elem, LstBeforeAppend, LstAfterAppend) :-
memberchk(Elem, LstBeforeAppend),
% Found answer - don't try alternative
!,
% Assign here, so logic is sound if e.g. LstAfterAppend has a value
LstAfterAppend = LstBeforeAppend.
% Add Elem to list
append_if_not_member_(Elem, LstBeforeAppend, [Elem|LstBeforeAppend]).
纯方法,只在列表中循环一次,以提高性能:
append_if_not_member(Elem, Lst, LstAfterAppend) :-
append_if_not_member_loop_(Lst, Lst, Elem, LstAfterAppend).
% Reached end of list, so Elem is not already present
append_if_not_member_loop_([], Lst, Elem, [Elem|Lst]).
% If head matches Elem, then can stop looking further
append_if_not_member_loop_([Elem|_], Lst, Elem, Lst).
append_if_not_member_loop_([H|T], Lst, Elem, LstAfterAppend) :-
% Head is different to Elem
dif(H, Elem),
% Continue checking the list
append_if_not_member_loop_(T, Lst, Elem, LstAfterAppend).
您没有处理项目已经在列表中的情况。此外,可能不需要检查空列表。所以只有两种情况:
- 如果
X
是Xs
的成员,则结果为Xs
- 否则。。。结果是
[X|Xs]
试试这样的东西:
try_prepend( X , Xs , Xs ) :- member(X,Xs), !.
try_prepend( X , Xs , [X|Xs] ) .