任何在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)
目前通过回溯解决.