Prolog:缺少功能?

pas*_*qui 5 prolog

任何在Prolog有一定经验的程序员都知道使用一元符号表示数字的优点.例如,如果我们将数字表示为1"("4"是列表"[1,1,1,1]"等等)的列表,我们可以定义:

unary_succ(X,[1|X]).
Run Code Online (Sandbox Code Playgroud)

以下查询执行预期的操作:

?- X=[1,1],unary_succ(X,Y).
X = [1, 1],
Y = [1, 1, 1].

?- unary_succ(X,Y),X=[1,1].
X = [1, 1],
Y = [1, 1, 1].

?- unary_succ(X,Y),Y=[1,1].
X = [1],
Y = [1, 1].
Run Code Online (Sandbox Code Playgroud)

通过这种方式,语句unary_succ(X,Y)以一种方式"绑定"X和Y,如果在声明事实之后,这些变量中的一个绑定到一个值,另一个绑定到一个值.

但是,如果我们使用内部数字表示,则无法执行此操作:

?- X=2,succ(X,Y).
X = 2,
Y = 3.

?- succ(X,Y),X=2.
ERROR: succ/2: Arguments are not sufficiently instantiated

?- succ(X,Y),Y=2.
ERROR: succ/2: Arguments are not sufficiently instantiated
Run Code Online (Sandbox Code Playgroud)

在我看来,先前的陈述和类似的陈述是预期的,这将是非常有用的.也就是说,我们需要以一种方式链接两个变量,当其中一个变量绑定到一个值时,另一个变量遵循先前建立的规则.

我的问题是:

a)在Prolog中做一些简单的方法.

b)如果不可能,支持此功能的任何其他编程语言?

欢迎任何评论.

感谢大家.

*附录I*

另一个例子是:

user_id(john,1234).
user_id(tom,5678).
Run Code Online (Sandbox Code Playgroud)

和查询:

X=john,user_id(X,Y).
user_id(X,Y),X=john
Run Code Online (Sandbox Code Playgroud)

目前通过回溯解决.