Проверьте этот термин как список различных переменных

Каков самый компактный и канонический способ в ISO Prolog для проверки списка отдельных переменных? Позвольте называть этот мета-логический предикат is_varset/1.

Таким образом, он должен преуспеть, если его аргумент представляет собой список переменных, которые все разные. Обратите внимание, что список всегда содержит [] в конце. Если переменная находится в конце, мы называем это неполным списком (который, таким образом, не является списком). И если непеременный термин встречается как суффикс, который не является ни [], ни переменной, то это ни неполный список, ни список.

Заметным частным случаем не являющегося ни неполным списком, ни списком являются бесконечные списки. Они содержат по крайней мере два суффикса, которые идентичны, на самом деле они тогда обладают бесконечно такими суффиксами. Бесконечные списки выходят за рамки стандарта. все попытки их создания приводят к унификации STO, результатом которой является undefined. Тем не менее, некоторые системы поддерживают их, поэтому в идеале для этих бесконечных списков is_varset/1 должен завершиться неудачно.

?- is_varset([A|nonlist]).
false.

?- is_varset([A,B]), is_varset([B,A]).
true.

?- is_varset([A,B,A]).
false.

?- is_varset([A,f(B)]).
false.

?- is_varset([A|_]).
false.

?- L = [_|L], is_varset(L).  % may loop, should rather terminate
false.

Вот обзор встроенных модулей в ISO/IEC 13211-1:1995, включая Cor.2: 2012.

Ответы

Ответ 1

это простое определение в SWI-Prolog, похоже, выполняет требования

is_varset(Vs) :- /*is_list(Vs),*/ term_variables(Vs, T), T == Vs.