我正在尝试从列表中删除重复但我得到false
,这是我的代码:
remov([],[]):-!.
remov([T|Q],[T|R]):-not(member(T,R)),remov(Q,[T|R]).
remov([T|Q],R):-member(T,R),!,remov(Q,R).
member(E,[]):-!,fail.
member(T,[T|Q]):-!.
member(E,[T|Q]):-member(E,Q).
答案 0 :(得分:1)
谓词if ($num > 0) {
echo $ID_utilisateur;
}
和$reqVerif->free_result;
$reqVerif->close();
的上述实现过度“使用”了元逻辑结构remov/2
和member/2
,这几乎破坏了所有声明性方面 - 迫使我们专注于大量细致的细节。有关详细信息,请参阅prolog-cut和logical-purity。
让我们根据iwhen/2
和(!)/0
重新实施not/1
,如下所示:
remov/2
这是如何运作的?
内置谓词sort/2
根据standard order对Prolog术语列表进行排序,从而消除了过程中的重复项。
请注意,如果输入列表包含变量,则remov(Xs,Ys) :-
iwhen(ground(Xs), sort(Xs,Ys)).
可能不会保留logical-purity。
sort/2
可确保在使用sort/2
时进行充分的实例化。
示例查询:
?- remov([1,2,3,1,2],Xs). Xs = [1,2,3]. ?- remov(Xs,Ys). ERROR: Arguments are not sufficiently instantiated