0

一个人将如何setarg_with_occurs_check/3
Prolog 中进行引导。Prolog 似乎有两种方法来创建循环数据结构。
不仅统一可以做到这一点,setarg/3 也可以:

/* SWI-Prolog 8.3.26 */
?- X = f(X).
X = f(X).

?- X = f(0), setarg(1,X,X).
X = f(X).

可以说我想要unify_with_occurs_check/2for的类似物
setarg/3。一个人将如何进行并实施相同的?

(顺便说一句,在某些 Prolog 系统中,setarg/3 有时使用
名称 change_arg/3,有些甚至根本没有)

4

1 回答 1

0

我认为您可以使用 ISO 谓词acyclic_term/1。因此,在 SWI-Prolog 中,您可以定义:

setarg_with_occurs_check(Arg, Term, Value) :-
    setarg(Arg, Term, Value),
    acyclic_term(Term).

例子:

?- X = f(0), setarg_with_occurs_check(1,X,Y).
X = f(Y).

?- X = f(0), setarg_with_occurs_check(1,X,X).
false.

?- X = f(X), Y = g(Z), setarg_with_occurs_check(1,Y,X).
false.
于 2021-09-05T16:51:10.803 回答