Your definition of floyd/2 works correctly with negation but it does enumerate each element of the cyclic list twice:
?- L = [1,0,1|L], floyd(1, L).
L = [1, 0, 1|L] ;
L = [1, 0, 1|L] ;
L = [1, 0, 1|L] ;
L = [1, 0, 1|L] ;
false.
I tried to implement a “member for cyclic lists” and I ended up with this:
member_cyc(X, L) :-
L = [_|T],
member_cyc_1(X, L, T).
member_cyc_1(X, Slow, Fast) :-
same_term(Slow, Fast), !,
Slow = [X|_].
member_cyc_1(X, Slow, Fast) :-
( Fast = [_,_|Fast0]
-> [X0|Slow0] = Slow,
( X = X0
; member_cyc_1(X, Slow0, Fast0)
)
; ( Fast = [_] ; Fast = [] )
-> member(X, Slow)
).
Does that look correct to you? This is what it does (comparison to floyd/2):
?- _Flat = [1,0,1], floyd(X, _Flat).
X = 1 ;
X = 0 ;
X = 1 ;
false.
?- _Flat = [1,0,1], member_cyc(X, _Flat).
X = 1 ;
X = 0 ;
X = 1.
?- _Cyclic = [1,0,1|_Cyclic], floyd(X, _Cyclic).
X = 1 ;
X = 0 ;
X = 1 ;
X = 1 ;
X = 0 ;
X = 1 ;
false.
?- _Cyclic = [1,0,1|_Cyclic], member_cyc(X, _Cyclic).
X = 1 ;
X = 0 ;
X = 1.
With the following definition of cantor_set/2 and cantor_set/2:
cantor_set(X) :- \+ member_cyc(1, X).
cantor_set2(X) :- sort(X, Y), \+ member(1, Y).
… and using your fuzzier, I get:
?- time((between(1,100000,_), fuzzy(X), cantor_set(X), fail; true)).
% 3,357,261 inferences, 0.198 CPU in 0.199 seconds (100% CPU, 16913324 Lips)
true.
?- time((between(1,100000,_), fuzzy(X), cantor_set2(X), fail; true)).
% 3,099,035 inferences, 0.205 CPU in 0.205 seconds (100% CPU, 15105160 Lips)
true.
Now the sort is marginally slower, on my computer. Can’t tell if it is correct though 
Note that this is now competing against an algorithm that mutates the list in C. A cycle detection using Floyd’s algorithm wouldn’t mutate the list and must be much faster if implemented in C.