

Example:
obtain_cyclic(L) :- L=[1,2,3,4,5|T],L=[1,2|T]. :- begin_tests(cyclic). test(01) :- obtain_cyclic(L),cyclic_term(L). test(02) :- obtain_cyclic([1|L]),cyclic_term(L). test(03) :- obtain_cyclic([1,2|L]),cyclic_term(L). test(04) :- obtain_cyclic([1,2,3|L]),cyclic_term(L). test(05) :- obtain_cyclic([1,2,3,4|L]),cyclic_term(L). test(06) :- obtain_cyclic([1,2,3,4,5|L]),cyclic_term(L). test(07) :- obtain_cyclic([1,2,3,4,5,3|L]),cyclic_term(L). test(08) :- obtain_cyclic([1,2,3,4,5,3,4|L]),cyclic_term(L). test(09) :- obtain_cyclic([1,2,3,4,5,3,4,5|L]),cyclic_term(L). test(10) :- obtain_cyclic([1,2,3,4,5,3,4,5,3|L]),cyclic_term(L). test(11) :- obtain_cyclic([1,2,3,4,5,3,4,5,3,4|L]),cyclic_term(L). test(12) :- obtain_cyclic([1,2,3,4,5,3,4,5,3,4,5|L]),cyclic_term(L). :- end_tests(cyclic). rt(cyclic) :- run_tests(cyclic).
And so:
?- rt(_). % PL-Unit: cyclic ............ done % All 12 tests passed true.
What is the cost of detecting that a term is cyclic (a rational tree)?
Another example, a list which contains itself:
?- list_to_ord_set([X,Y,Z],X). X = [X, Y, Z].
?- list_to_ord_set([X,Y,Z],X),X=[W|_],W=[WW|_],WW=[WWW|_]. X = W, W = WW, WW = WWW, WWW = [WWW, Y, Z].