我在Prolog中的函数没有给出预期的输出



所以基本上,我想在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).

您没有处理项目已经在列表中的情况。此外,可能不需要检查空列表。所以只有两种情况:

  • 如果XXs的成员,则结果为Xs
  • 否则。。。结果是[X|Xs]

试试这样的东西:

try_prepend( X , Xs ,    Xs  ) :- member(X,Xs), !.
try_prepend( X , Xs , [X|Xs] ) .

最新更新