- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试深入研究以下的 GNU Prolog 行为:
test(X,I,O) :- phrase(X,I,O).
?- test(("a",!,"b"),"ab","").
有没有标准的方法来查看 phrase/3 翻译了什么?
根据ISO DCG提案(*),有要求我们将有一个 expand_term/2。现在我可以用它来检查:
?- expand_term((foo --> "a", !, "b"),X).
X = (foo([97|A],B):-!,A=[98|B])
这是否告诉我 phrase/3 在我的 test/3 中是如何使用的?
(*)ISO/IEC DTR 13211–3:2006
定子句语法规则
克劳斯·戴斯勒
2012 年 11 月 20 日
http://www.complang.tuwien.ac.at/ulrich/iso-prolog/dcgs/dcgsdin121120.pdf
最佳答案
Is there a standard way to see the what phrase/3 translates?
没有。定义了phrase/3
的含义,但后面的实际实现是不可访问的。 phrase/3
有几种不同的定义方式。它可以像 in YAP 一样简单:
phrase(P, S0, S) :-
call(P, S0, S).
或者它可以使用 expand_term/2
(或类似的东西)。即:
phrase(P, S0, S) :-
expand_term(( pseudont --> P ), ( pseudont(CS0, CS) :- Goal) )),
S0 = CS0,
S = CS,
Goal.
它可以在调用Goal
之后执行最后的统一:
phrase(P, S0, S) :-
expand_term(( pseudont --> P ), ( pseudont(CS0, CS) :- Goal) )),
S0 = CS0,
Goal,
S = CS.
通过引入(依赖于实现的)约定,扩展谓词总是在最后一个参数中使用未实例化和未别名的变量调用,这将允许在半上下文存在的情况下进行尾递归。
这完全取决于实现者。
Does this tell me how phrase/3 is used in my test/3?
没有,没有办法说。
但是,你为什么要问?或者,换句话说:
What effect could a differing but conforming implementation of
phrase/3
have?
这应该是显而易见的。考虑 ?- phrase([],Xs).
,它不会在 YAP 的堆上创建任何术语,但会为上面的朴素 expand_term
扩展创建任何术语。但是,资源消耗超出了当前标准的范围。
考虑 YAP 中规则的主体 ..., phrase([], Xs, Xs), ...
:Xs
仍然是局部变量,而一个基于 expand_term
的短语使其成为全局性的。在许多实现中,这会影响变量的相对顺序。现在,标准在 7.2.1 中明确指出:
If X and Y are variables which are not identical then
X term_precedes Y shall be implementation dependent
except that during the creation of a sorted list (7.1.6.5,
8.10.3.1 j) the ordering shall remain constant.
所以这又不是问题,但这仍然可能很烦人。
Prolog 标准(即 ISO/IEC 13211-1 第 1 部分)仅定义了 NSTO 的执行。也就是说,如果在执行期间发生的所有统一都是 NSTO — 不受发生检查的约束(参见 7.3.3)。
现在,考虑您的情况:phrase(("a",!,"b"), Xs, Ys)
。乍一看,这等同于 phrase("ab", Xs, Ys)
。但现在考虑假设 set_prolog_flag(double_quotes,chars)
?- Xs = [c|_], Xs = Ys, phrase(("a",!,"b"), Xs, Ys).
毫无疑问,这个查询应该会失败。但它是 NSTO 吗?天真地,我们可以假设这可以被替换为:
?- Xs = [c|_], Xs = Ys, Xs = [a,b|Ys].
相当于:
?- Xs = [c|_], Xs = [a,b|Xs].
显然,Xs = [a,b|Xs]
本身就是 STO(受制于发生检查)。而且两者加起来都是STO!要理解这一点,请考虑 7.3.2 中的 Herbrand 算法。本质上,它不确定地“以任何顺序”重写方程。这是一个这样的推导:
Xs = [c|Zs], Xs = [a,b|Xs].
(7.3.2 f) Xs = [c|Zs], [c|Zs] = [a,b,c|Zs].
(7.3.2 d) Xs = [c|Zs], c = a, Zs = [b,c|Zs].
(7.3.2 g) failure (not unifiable, positive occurs-check)
当然,这种推导是不寻常的。通常,在 c = a
存在的情况下会立即失败,但该算法在这方面是不确定的。只有当所有可能的推导都不会导致 7.3.2 g 时,一组方程才是 NSTO。引用7.3.3:
A set of equations (or two terms) is "not subject to
occurs-check" (NSTO) iff there exists no way to proceed
through the steps of the Herbrand Algorithm such that
7.3.2 g happens.
这些结构也可能受到影响。虽然现有标准文件目前未涵盖它们,但了解潜在影响仍然具有相关性。考虑:
?- freeze(L, (X=1;X=2)), phrase(("a",!,"b"),L).
L = [a,b], X = 1.
B、SICStus、SWI、YAP 都产生了这个答案。所以削减很重要。
无论如何,感谢您的提问——我只是在回答您的问题时才了解 NSTO 问题!这显然对 DCG 翻译的制定方式产生了一些影响。
关于prolog - 查看 phrase/3 翻译的标准方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14140678/
我最近在读 CSAPP。在 10.9 节中,它说标准 I/O 不应该与 socket 一起使用,原因如下: (1) The restrictions of standard I/O Restricti
似乎是一个足够标准的问题,可以保证解决方案中的标准设计: 假设我想在文件中写入 x+2(或更少)个字符串。 x 字符串构成一个部分的内容,这两个字符串构成该部分的页眉和页脚。要注意的是,如果内容中没有
代码版本管理 在项目中,代码的版本管理非常重要。每个需求版本的代码开发在版本控制里都应该经过以下几个步骤。 在master分支中拉取该需求版本的两个分支,一个feature分支,
我有以下sql查询,我需要获取相应的hibernate条件查询 SELECT COUNT(DISTINCT employee_id) FROM erp_hr_payment WHERE payment
所以我正在编写一些代码,并且最近遇到了实现一些 mixin 的需要。我的问题是,设计混音的正确方法是什么?我将使用下面的示例代码来说明我的确切查询。 class Projectile(Movable,
我的环境变量包含如下双引号: $echo $CONNECT_SASL_JAAS_CONFIG org.apache.kafka.common.security.plain.PlainLoginModu
示例: /** * This function will determine whether or not one string starts with another string. * @pa
有没有办法在 Grails 中做一个不区分大小写的 in 子句? 我有这个: "in"("name", filters.tags) 我希望它忽略大小写。我想我可以做一个 sqlRestriction
我搜索了很长时间,以查找将哪些boost库添加到std库中,但是我只找到了一个新库的完整列表(如此处:http://open-std.org/jtc1/sc22/wg21/docs/library_t
我已经通过使用这个肮脏的黑客解决了我的问题: ' Filter managerial functions ActiveSheet.Range("$A$1:$BW$2211").Auto
因此,我很难理解我需要遵循的标准,以便我的 Java 程序能够嵌入 HTML。我是否只需将我的主类扩展到 Applet 类,或者我还需要做更多的事情吗?另外,在我见过的每个 Applet 示例中,它都
我对在 Hibernate 中使用限制有疑问。 我必须创建条件,设置一些限制,然后选择日期字段最大值的记录: Criteria query = session.createCriteria(Stora
我有标准: ICriteria criteria = Session.CreateCriteria() .SetFetchMode("Entity1", FetchMo
我很难编写条件来选择所有子集合或孙集合为空的实体。我可以将这些作为单独的条件来执行,但我无法将其组合成一个条件。 类结构: public class Component { p
@Entity class A { @ManyToMany private List list; ... } @Entity class B { ... } 我想使用条件(不是 sql 查询)从 A
我的数据库中有以下表结构: Table A: Table B: Table C: _______________
请帮助我: 我有下一张 table : 单位 ID 姓名 用户 ID 姓名 利率 单位 ID 用户 ID 我不明白如何从 SQL 创建正确的条件结构: 代码: SELECT * FROM Unit W
我正在构建一个包含项目的网站,每个项目都有一个页面,例如: website.com/book/123 website.com/film/456 website.com/game/789 每个项目都可以
我需要使用两个属性的组合来过滤结果列表。一个简单的 SQL 语句如下所示: SELECT TOP 10 * FROM Person WHERE FirstName + ' ' + LastName L
我有一个“ super 实体”SuperEntity 和三个扩展父类(super class)的实体 ChildEntity1、...、ChildEntity3。 搜索数据库中的所有实体很容易,即我们
我是一名优秀的程序员,十分优秀!