有理树(循环项)

SWI-Prolog 支持有理树(rational trees),也称为循环项(cyclic terms)。这里的“支持”定义为:面对有理树时,大多数相关内置谓词都能终止。SWI-Prolog 几乎所有内置项操作谓词,都能以与该项在栈上表示所用内存量成线性关系的时间处理项。下面这些谓词可以安全处理有理树:

=../2==/2=@=/2=/2@</2@=</2@>=/2@>/2\==/2\=@=/2\=/2acyclic_term/1bagof/3compare/3copy_term/2cyclic_term/1dif/2duplicate_term/2findall/3ground/1term_hash/2numbervars/3numbervars/4recorda/3recordz/3setof/3subsumes_term/2term_variables/2throw/1unify_with_occurs_check/2unifiable/3when/2write/1(以及相关谓词)。

此外,一些内置谓词会识别有理树并抛出合适的异常。算术求值属于这一类。编译器(asserta/1 等)也会抛出异常。未来版本可能支持有理树。能够对有理树提供有意义处理的谓词会抛出 representation_error。对于没有有意义解释的有理树,相关谓词会抛出 type_error。例如:

1 ?- A = f(A), asserta(a(A)).
ERROR: asserta/1: Cannot represent due to `cyclic_term'
2 ?- A = 1+A, B is A.
ERROR: is/2: Type error: `expression' expected, found
             `@(S_1,[S_1=1+S_1])' (cyclic term)