gpt4 book ai didi

Prolog:缺少功能?

转载 作者:行者123 更新时间:2023-12-04 18:05:11 25 4
gpt4 key购买 nike

任何对 Prolog 有一定经验的程序员都知道对数字使用一元表示法的好处。例如,如果我们将一个数字表示为 1"的列表("4"是列表 "[1,1,1,1]"等等),我们可以定义:

unary_succ(X,[1|X]).

以下查询符合预期:
?- 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].

通过这种方式,语句 unary_succ(X,Y) “绑定(bind)” X 和 Y,如果在陈述事实之后,这些变量中的一个绑定(bind)到一个值,另一个则绑定(bind)。

但是,如果我们使用内部数字表示,则这种行为是不可能的:
?- 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

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

我的问题是:

a) 在 Prolog 中使用一些简单的方法来做到这一点。

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

欢迎任何评论。

谢谢大家。

* 附录 I *

另一个例子是:
user_id(john,1234).
user_id(tom,5678).

和查询:
X=john,user_id(X,Y).
user_id(X,Y),X=john

目前通过回溯解决。

最佳答案

此主题称为 coroutining ,并且要以相当一般的方式解决 - afaik - 需要扩展基本的 Prolog 计算模型。幸运的是,大多数 Prologs 都有这样的扩展......所以,让我们试试 in SWISH构建您自己的“响应式(Reactive)”扩展:

my_succ(X, Y) :- when((nonvar(X);nonvar(Y)), succ(X, Y)).

编辑不完全正确,但 Jan 在 SWI-Prolog 邮件列表上发布了一个协程应用程序的简单示例:
?- freeze(X, writeln(X)), findall(X, between(1,3,X), Xs).
1
2
3
Xs = [1, 2, 3],
freeze(X, writeln(X)).

关于Prolog:缺少功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30392002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com