Prolog:检查列表中的重复项

LRA*_*RAC 2 list prolog prolog-dif

  1. 编写一个谓词,allDistinct/1其参数是符号列表,如果列表中的所有符号都不同,则成功.

    notin(A,[]).
    notin(A,[B|C]) :-
       A\=B,
       notin(A,C).
    
    allDistinct([]).
    allDistinct([_]).
    allDistinct([A|B]) :-
       notin(A,B), 
       allDistinct(B).
    
    Run Code Online (Sandbox Code Playgroud)

rep*_*eat 5

按照@whd的上一个草图,我们可以像这样继续.

基于iwhen/2我们可以简洁地定义distinct/1如下:

:- use_module(library(lists), [same_length/2]).

distinct(Es) :-
   iwhen(ground(Es), (sort(Es,Fs),same_length(Es,Fs))).
Run Code Online (Sandbox Code Playgroud)

使用SICStus Prolog 4.5.0的示例查询:

| ?- distinct([1,2,3]).
yes
| ?- distinct([1,2,3.0]).
yes
| ?- distinct([1,2,3.0,2]).
no
| ?- distinct([1,2,3.0,X]).
! error(instantiation_error,_283)