查看Prolog文档,谓词签名有时写成如下:
foo(:Bar, +Baz, -Qux, ?Mop)
Run Code Online (Sandbox Code Playgroud)
什么是:,+,-和?为以及如何解读?此外,这些是唯一存在的还是更多?
在语法规则(dcg)中,有几个预定义的构造:(',')//2意思是连接,('|')//2意思是交替等.一个由几个但不是所有Prolog系统支持的构造是(\+)//1.
就个人而言,我只是为了使用它而使用它.我从未在其他人编写的代码中看到它.
那么,有合法用途(\+)//1吗?
编辑:,另外,是否有合法的使用(\+)//1在查询中phrase(nt, L)使用L一个非实例变量.
Hilog术语(即具有作为算子任意术语的化合物)是否仍被视为XSB Prolog(或任何其他Prolog)中的强大功能?目前有许多XSB项目正在使用此功能吗?例如他们中的哪一个?
我问,因为据我所知,高阶编程同样可以使用ISO内置调用/ N.
具体来说,我想了解XSB是否仅仅出于历史原因使用Hilog术语,或者如果Hilog术语与当前的ISO标准相比具有相当大的优势.
在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)只选择 ifOp是不正确的列表,以及type_error(atom,Op)是否Op是任何其他非原子.
那么在哪种意义上使用"类型",以及如何处理上述混乱?
我有这个跟踪元解释器,从以前的问题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谓词的时间复杂度是否有上限保证?
例如:在任何符合标准的Prolog系统中,是否确定sort(+List, ?SortedList)在O(nlog(n))时间(n是长度List)中运行?
考虑以下对无上下文语法的扩展,该语法允许规则在左侧,非终端右侧的一个(或多个)终端.也就是说,形式的规则:
A b -> ...
Run Code Online (Sandbox Code Playgroud)
右侧可以是任何东西,例如在无上下文的语法中.特别是,不要求右侧的末端具有完全相同的终端符号.在这种情况下,此扩展将是上下文相关的.但终端不仅仅是一个背景.有时,这个终端被称为"后推".
显然,这不再是CFG(类型-2).它包括类型1.但它是什么?真的输0了吗?
Prolog 中的Definite Clause Grammars dcg允许这种特殊的扩展.(为了避免误解,我在这里不考虑Prolog的完整扩展.即我假设终端来自有限的字母而不是任意的术语,我也不认为Prolog在DCG中允许的其他参数,这些参数也属于类型 - 已经0了.)
编辑:这是一种更简单的描述扩展的方法:添加到表单的CFG规则
A b -> <epsilon>
Run Code Online (Sandbox Code Playgroud) 什么是Prolog运算符^?
查看Prolog内置指令op,列出了内置运算符.
我看
**是取幂
/ \是或
但是^是什么?
当前三个答案中的每一个都是有价值的,我学到了一些东西:
为什么**/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) 就辅助空间消耗而言,编写功能符号通常非常昂贵。这对于列表的规范编写尤其重要。
首先考虑输出的大小:对于长度为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总是使用方括号。
iso-prolog ×10
prolog ×9
dcg ×2
lambda ×1
list ×1
prolog-cut ×1
prolog-setof ×1
signature ×1
xsb ×1