Python语言的编程模式:什么是“强模式”编程语言 (you got moded)

我正在查看 Mercury 编程语言的about page,当我发现一个部分,它说:

水星是一种强烈的语言

这是什么意思!?我已经在互联网上搜索了所有内容,但没有找到答案!

6

我不知道有modes在水星中使用的任何其他语言。以下是来自水星手册

The mode of a predicate (or function) is a mapping from the initial
state of instantiation of the arguments of the predicate (or the
arguments and result of a function) to their final state of
instantiation.

如果你熟悉 prolog,你可能知道这意味着什么。

考虑C中具有以下 typedecl 的函数

void sort(int * i, int * o);

假设此函数将数组i排序为另一个数组o。仅从此声明中,我们无法保证从i读取并写入o。如果我们可以另外写入mode sort(in, out),则建议编译器从第一个参数读取并写入第二个参数。然后,编译器检查是否将

对于像C这样的语言,这可能不合适,但是对于prolog家族语言,这是一个非常受欢迎的功能。考虑append/3谓词,当连接的前两个列表是第三个列表时,它将成功。

append([1, 2], [a, b], X).
X = [1, 2, a, b]

因此,如果我们提供两个输入列表,我们会得到一个输出列表。但是当我们提供输出列表并要求所有导致它的解决方案时,我们有

append(X, Y, [1, 2, a, b]).
X = [],
Y = [1, 2, a, b] ;
X = [1],
Y = [2, a, b] ;
X = [1, 2],
Y = [a, b] ;
X = [1, 2, a],
Y = [b] ;
X = [1, 2, a, b],
Y = [] ;
false.

这个append([1], [2], [3]).append([1], [2], [1, 2]).成功的地方失败。因此,根据我们如何使用谓词,我们可以有一个确定性的答案,多个答案,或者根本没有答案。谓词的所有这些属性最初可以通过模式声明来声明。以下是append的模式声明:

:- pred append(list(T), list(T), list(T)).
:- mode append(in, in, out) is det.
:- mode append(out, out, in) is multi.
:- mode append(in, in, in) is semidet.

如果你提供了前两个,那么输出是确定性确定的。如果你提供了最后一个参数,那么你对前两个参数有多个解决方案。如果你提供了所有三个列表,那么它只是检查前两个被追加时我们是否得到第三个列表。

模式不限于 in,out。在处理 IO 时,您将看到di性输入和uo唯一输出。它们只是告诉我们谓词如何更改我们提供的参数的实例化。输出从自由变量变为基本术语,输入仍然是基本术语。因此,作为用户,您可以定义:- mode input == ground >> ground.:- mode output == free >> ground.并使用

考虑一个计算列表长度的谓词。我们不需要实例化整个列表,因为我们知道长度 ([X,Y],2) 是真的,即使 X,Y 是自由变量。所以模式声明:- mode length(in, out) is det.是不够的,因为整个第一个参数不需要实例化。因此,我们还可以定义参数:- inst listskel == bound([] ; [free | listskel]).的实例化程度a 参数2 是空的

由于 haskell 的懒惰性质,这种部分评估也发生在 haskell 中,例如,不需要评估整个列表即可知道其长度。

References: modes determinism

编辑:从汞网站 Currently only a subset of the intended mode system is implemented. This subset effectively requires arguments to be either fully input (ground at the time of call and at the time of success) or fully output (free at the time of call and ground at the time of success).

1

模式指定数据流的方向,例如输入或输出。

在某些语言中,数据流的方向是固定的,并且隐含在语法中。例如,在大多数函数式语言中,函数参数总是输入,函数结果总是输出。

但是,在大多数逻辑编程语言中,数据流的方向是在运行时确定的。大多数逻辑编程语言都是动态模式

在 Mercury 中,必须声明数据流的方向,至少在模块边界处。但是,Mercury 中的单个谓词或函数可以具有多种模式;编译器在编译时解析模式,并为每种模式生成单独的代码。

Mercury 还支持带有约束求解的可选动态模式。(请参阅https://www.researchgate.net/publication/220802747_Adding_Constraint_Solving_to_Mercury。)
但默认为静态模式。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(244)
自动seo源码:如何删除Yoastseopremium中的自动重定向URL
上一篇
出口退税商品代码是什么:这是什么意思出口(主( ))(exited def)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(75条)