相关疑难解决方法(0)

min_member/2的反直觉行为

min_member(-Min ,+ List)

如果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 min clpfd

10
推荐指数
3
解决办法
303
查看次数

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

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

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

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

prolog signature iso-prolog

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

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

在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
查看次数

标签 统计

iso-prolog ×2

prolog ×2

clpfd ×1

min ×1

signature ×1