[英]Test that term is a list of distinct variables
ISO Prolog中用於測試不同變量列表的最緊湊和規范的方法是什么? 我們稱這個元邏輯謂詞為is_varset/1
。
因此,如果它的參數是一個完全不同的變量列表,它應該會成功。 請注意,列表的末尾始終包含[]
。 如果變量在最后,我們將其稱為部分列表 (因此不是列表)。 如果一個非變量項作為既不是[]
也不是變量的后綴出現,那么這既不是部分列表也不是列表 。
術語既不是部分列表也不是列表的一個值得注意的特殊情況是無限列表 。 它們包含至少兩個相同的后綴,實際上它們擁有無限的后綴。 無限列表超出了標准的范圍 - 所有創建它們的嘗試都會導致STO統一,其結果是未定義的。 盡管如此,有些系統支持它們,因此理想情況下,對於那些無限列表, 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.
SWI-Prolog中的這個簡單定義似乎可以滿足要求
is_varset(Vs) :- /*is_list(Vs),*/ term_variables(Vs, T), T == Vs.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.