标签: iso-prolog

Prolog谓词参数中实例化模式指标的含义

查看Prolog文档,谓词签名有时写成如下:

foo(:Bar, +Baz, -Qux, ?Mop)
Run Code Online (Sandbox Code Playgroud)

什么是:,+,-?为以及如何解读?此外,这些是唯一存在的还是更多?

prolog signature iso-prolog

9
推荐指数
2
解决办法
1166
查看次数

合法使用(\ +)// 1

在语法规则()中,有几个预定义的构造:(',')//2意思是连接,('|')//2意思是交替等.一个由几个但不是所有Prolog系统支持的构造是(\+)//1.

就个人而言,我只是为了使用它而使用它.我从未在其他人编写的代码中看到它.

那么,有合法用途(\+)//1吗?

编辑:,另外,是否有合法的使用(\+)//1在查询中phrase(nt, L)使用L一个非实例变量.

prolog dcg iso-prolog

8
推荐指数
1
解决办法
169
查看次数

Hilog术语(XSB)Prolog

Hilog术语(即具有作为算子任意术语的化合物)是否仍被视为XSB Prolog(或任何其他Prolog)中的强大功能?目前有许多XSB项目正在使用此功能吗?例如他们中的哪一个?

我问,因为据我所知,高阶编程同样可以使用ISO内置调用/ N.

具体来说,我想了解XSB是否仅仅出于历史原因使用Hilog术语,或者如果Hilog术语与当前的ISO标准相比具有相当大的优势.

prolog xsb iso-prolog meta-predicate

8
推荐指数
1
解决办法
520
查看次数

标准中使用了"类型"的含义?

在Prolog的ISO标准的第一部分,ISO/IEC 13211-1:1995中,"类型"的概念用于指代不同的事物.这通常会导致混淆.例如,名为IsoErrata(存档版本,)的页面声明(请注意,此页面与ISO无关):

7.12.2和8.1.2.1

关于什么是"类型"存在混淆.似乎有3个不同的组:

  • 8.1.2.1中列出的那些,也在7.12.2.b中的type_error术语中作为ValidTypes出现
  • 8.1.2.1中列出的那些,在7.12.2.c中的domain_error术语中作为ValidDomain出现
  • 仅在8.1.2.1中列出的那些

此外,7.12.2.c中有ValidDomains,未在8.1.2.1中列出,可能是错误的(例如io_mode).

8.14.3.3.f

模板需要atom_or_atom_list第三个参数的类型,但奇怪的是这里所需的错误术语是 type_error(list,Operator).这导致(见例子)

op(30,xfy,0) =====> error(type_error(list,0))

哪里type_error(atom,0)或哪个type_error(atom_or_atom_list,0)更合适(但请注意,这atom_or_atom_list不是7.12.2中列出的ValidTypes!).因此,对于ECLiPSe,我们type_error(list,Op)只选择 if Op是不正确的列表,以及 type_error(atom,Op)是否Op是任何其他非原子.

那么在哪种意义上使用"类型",以及如何处理上述混乱?

iso-prolog

8
推荐指数
1
解决办法
380
查看次数

实现切入跟踪元解释器序言

我有这个跟踪元解释器,从以前的问题Prolog unbind绑定变量改变.

我不明白如何解释切.感谢用户@false告诉我切割工作很糟糕,我的问题是,我应该如何在这个元解释器中实现切割?

%tracer
mi_trace(Goal):-
    mi_trace(Goal, 0).

mi_trace(V, _):-
    var(V), !, throw(error(instantiation_error, _)).
mi_trace(true, _Depth):-!, true.
mi_trace(fail, _Depth):-!, fail.
mi_trace(A > B, _Depth):-!, A > B.
mi_trace(A < B, _Depth):-!, A < B.
mi_trace(A =< B, _Depth):-!, A =< B.
mi_trace(A >= B, _Depth):-!, A >= B.
mi_trace(A = B, _Depth):-!, A = B.
mi_trace(A is B, _Depth):-!, A is B.
mi_trace(\+A, _Depth):-!, \+mi_trace(A, _Depth).
mi_trace(!, _Depth):-!, fail. % <- this is wrong
mi_trace((Goal1, Goal2), Depth):-
    !,
    mi_trace(Goal1, …
Run Code Online (Sandbox Code Playgroud)

prolog iso-prolog prolog-cut

8
推荐指数
1
解决办法
1080
查看次数

ISO Prolog谓词的复杂性

标准Prolog谓词的时间复杂度是否有上限保证?

例如:在任何符合标准的Prolog系统中,是否确定sort(+List, ?SortedList)在O(nlog(n))时间(n是长度List)中运行?

prolog time-complexity iso-prolog

8
推荐指数
1
解决办法
534
查看次数

扩展到CFG,它是什么?

考虑以下对无上下文语法的扩展,该语法允许规则在左侧,非终端右侧的一个(或多个)终端.也就是说,形式的规则:

A b -> ...
Run Code Online (Sandbox Code Playgroud)

右侧可以是任何东西,例如在无上下文的语法中.特别是,要求右侧的末端具有完全相同的终端符号.在这种情况下,此扩展将是上下文相关的.但终端不仅仅是一个背景.有时,这个终端被称为"后推".

显然,这不再是CFG(类型-2).它包括类型1.但它是什么?真的输0了吗?

Prolog 中的Definite Clause Grammars 允许这种特殊的扩展.(为了避免误解,我在这里不考虑Prolog的完整扩展.即我假设终端来自有限的字母而不是任意的术语,我也不认为Prolog在DCG中允许的其他参数,这些参数也属于类型 - 已经0了.)


编辑:这是一种更简单的描述扩展的方法:添加到表单的CFG规则

A b -> <epsilon>
Run Code Online (Sandbox Code Playgroud)

prolog context-free-grammar dcg iso-prolog dcg-semicontext

7
推荐指数
2
解决办法
439
查看次数

什么是Prolog运算符^?

什么是Prolog运算符^?

查看Prolog内置指令op,列出了内置运算符.

我看
**是取幂
/ \是或

但是^是什么?

当前三个答案中的每一个都是有价值的,我学到了一些东西:

  • 罗伊为这本书
  • 这个例子是假的
  • 我接受了CapelliC的答案,因为它明确表示^/2具有多种含义,
    具体取决于上下文,立即消除了我的困惑.

lambda prolog exponentiation iso-prolog prolog-setof

7
推荐指数
3
解决办法
1517
查看次数

由于**和^的运算符优先级不同而导致的轻微不一致

为什么**/2(xfx)和(^)/2(xfy)的参数优先级在Prolog中不一样?

这会导致轻微的不一致,例如:

?- X = 1, Y is 1 ^ -X.
X = Y, Y = 1.
Run Code Online (Sandbox Code Playgroud)

和:

?- Y is 1 ** -1.
Y = 1.
Run Code Online (Sandbox Code Playgroud)

但:

?- X = 1, Y is 1 ** -X.
ERROR: Syntax error: Operator priority clash
ERROR: X = 1, Y is 1 *
ERROR: ** here **
ERROR: * -X .
Run Code Online (Sandbox Code Playgroud)

prolog operator-precedence iso-prolog

7
推荐指数
1
解决办法
138
查看次数

节省空间的功能符号书写

就辅助空间消耗而言,编写功能符号通常非常昂贵。这对于列表的规范编写尤其重要。

首先考虑输出的大小:对于长度为n的列表,通常的ignore_ops(false)书写需要至少2n+1 个字符,如 in ,规范书写至少需要7n+2 个字符,如。(添加:)无法更改输出,因为它是这样定义的,但是,编写过程中还有很大的改进空间:[1,2,3]'.'(1,'.'(2,'.'(3,[])))

现在考虑编写输出所需的辅助空间:用方括号编写列表不需要任何与列表长度成正比的辅助空间。朴素的规范写作需要与列表长度成比例的空间来表示缩进堆栈。

如何在没有这种开销的情况下规范地编写列表?


这是一个简单的测试,用于检查系统中发生的情况。

首先,减少最大虚拟内存大小以减少您的等待时间,一些 180M-ish 适合我。

$ ulimit -v -180000
Run Code Online (Sandbox Code Playgroud)

nat_sx(N0, s(X)) :-
   N0 > 0,
   N1 is N0-1, nat_sx(N1,X).
nat_sx(0, 0).

?- open('/dev/null',write,Null),
   length(_,I), N is 10^I, nat_sx(N,SX),
   ( Res=unwritten ; write_canonical(Null,SX) ).
Run Code Online (Sandbox Code Playgroud)

SICStus 和 SWI 现在都在write_canonical(Null, SX). 预计它们会在nat_sx/2. 列表的直接比较是不可能的,因为 SWIwrite_canonical/1总是使用方括号。

list prolog iso-prolog

7
推荐指数
1
解决办法
244
查看次数