相关疑难解决方法(0)

Prolog中更安全的类型测试

ISO-Prolog(ISO/IEC 13211-1:1995,包括Cor.1:2007,Cor.2:2012)提供了以下用于测试术语类型的内置谓词:

8.3型式试验

1 var/1.2原子/ 1.3整数/ 1.4浮点/ 1.5原子/ 1.6化合物/ 1.7 nonvar/1.8号/ 1.9可赎回/ 1.10地/ 1.11 acyclic_term/1.

在这一组中有那些目的只是为了测试某种实例,即8.3.1 var/1,8.3.7 nonvar/1,8.3.10 ground/1,而那些假设长期充分实例化使得型式试验是安全的.不幸的是,它们与测试具体实例相结合.

考虑目标integer(X),其失败,如果X是一个nonvar术语,不是一个整数,并X是一个变量.这破坏了许多理想的声明属性:

?- X = 1, integer(X).
true.

?- integer(X), X = 1.
false.
Run Code Online (Sandbox Code Playgroud)

理想情况下,第二个查询将使用某种形式的coroutining成功; 或者根据错误分类发出实例化错误1.毕竟:

7.12.2错误分类

错误根据Error_term的形式分类:

a)当
参数或其中一个组件是变量并且需要
实例化的参数或组件时,应该存在实例化错误.它有
形式instantiation_error.

...

请注意,实例化测试和类型测试的这种隐式组合会导致Prolog程序中的许多错误,并且也会出现在SO上.

对这种情况的快速解决方法是在内置的每个测试之前添加一个显式测试,或者详细说明

   ( var(T) -> throw(error(instantiation_error,_)) ; true),
   integer(T), ....
Run Code Online (Sandbox Code Playgroud)

或更紧凑

functor(T, _,_),
integer(T), ....
Run Code Online (Sandbox Code Playgroud)

它甚至可以

T =.. _,
integer(T), …
Run Code Online (Sandbox Code Playgroud)

prolog iso-prolog

18
推荐指数
1
解决办法
622
查看次数

Prolog最佳实践参考?

是否有(相对)当前参考Prolog的最佳实践?一个适合给那些没有学过逻辑程序设计的商业Prolog开发人员或者像"The Prraft of Colog"这样的高级文本?

有很多一般的教程,但我能找到的唯一最佳实践是1994年的这个:

http://www.cs.auckland.ac.nz/~j-hamer/07.363/prolog-for-se.html

comp.lang.prolog上还有个别问题,或者如下所示:

Prolog最佳实践:检查变量是否已绑定.

但没有什么比商业开发者更全面,最新,更合适了.

这个问题出现在一份工作的访谈中,这项工作需要对初学者和中级Prolog开发人员进行正式的指导和代码审查.作为一名经验丰富的Prolog承包商,我经常为其他具有产品及其领域知识的开发人员提供建议,但他们是自学成才或者Prolog培训有限.但指导是在临时的基础上,回应他们特定的日常问题.

无论如何,我已经离开Prolog开发了一段时间,面试官的问题让我觉得应该有这样的参考.如果那里没有一个,如果我得到这个工作,我可能会自己创建它.

prolog

4
推荐指数
1
解决办法
908
查看次数

查找列表中的唯一项目

我正在尝试编写一个规则来决定一个项目是否X恰好出现在列表中L.

unique(X, [X|T]):- !, \+ member(X, T).
unique(X, [_|T]):- unique(X, T).
Run Code Online (Sandbox Code Playgroud)

该规则适用于确定值是否在列表中是唯一的,或者当我尝试使用unique(X, [1,2,3,1,3,2,5,4,3,8]).它在列表中获取唯一值时返回正如false.我所期望的那样(如member(X, list).:

X = 5 ;
X = 4 ;
X = 8 ;
Run Code Online (Sandbox Code Playgroud)

我是一个完全的初学者,我不知道我做错了什么.

prolog

3
推荐指数
2
解决办法
2900
查看次数

标签 统计

prolog ×3

iso-prolog ×1