如果Min是标准术语中最小的成员,则为True.如果List为空,则失败.
?- min_member(3, [1,2,X]).
X = 3.
Run Code Online (Sandbox Code Playgroud)
解释当然是变量在标准的术语顺序中位于所有其他术语之前,并且使用统一.但是,报告的解决方案感觉有些不对劲.
怎么可以说是合理的?我该如何解释这个解决方案?
编辑:
防止min_member/2成功使用此解决方案的一种方法是更改标准库(SWI-Prolog)实现,如下所示:
xmin_member(Min, [H|T]) :-
xmin_member_(T, H, Min).
xmin_member_([], Min0, Min) :-
( var(Min0), nonvar(Min)
-> fail
; Min = Min0
).
xmin_member_([H|T], Min0, Min) :-
( H @>= Min0
-> xmin_member_(T, Min0, Min)
; xmin_member_(T, H, Min)
).
Run Code Online (Sandbox Code Playgroud)
失败而不是抛出实例化错误(@mat在他的回答中建议,如果我理解正确的话)的理由是,这是一个明确的问题:
" [1,2,X]当X是自由变量时,3是最小成员吗?"
对此的答案是(至少对我来说)一个明确的"不",而不是"我无法说出来".
这与以下行为属于同一类sort/2:
?- sort([A,B,C], [3,1,2]).
A = 3,
B = 1,
C = 2.
Run Code Online (Sandbox Code Playgroud)
适用相同的技巧:
?- …Run Code Online (Sandbox Code Playgroud) 查看Prolog文档,谓词签名有时写成如下:
foo(:Bar, +Baz, -Qux, ?Mop)
Run Code Online (Sandbox Code Playgroud)
什么是:,+,-和?为以及如何解读?此外,这些是唯一存在的还是更多?
在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是任何其他非原子.
那么在哪种意义上使用"类型",以及如何处理上述混乱?