gpt4 book ai didi

prolog - Prolog 中更安全的类型测试

转载 作者:行者123 更新时间:2023-12-03 13:37:08 25 4
gpt4 key购买 nike

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

8.3 Type testing

1 var/1. 2 atom/1. 3 integer/1. 4 float/1. 5 atomic/1. 6 compound/1. 7 nonvar/1. 8 number/1. 9 callable/1. 10 ground/1. 11 acyclic_term/1.



在这个组中,有些人的目的仅仅是测试某个实例,即 8.3.1 var/1 , 8.3.7 nonvar/1 , 8.3.10 ground/1 ,以及那些假设一个术语被充分实例化使得类型测试是安全的。不幸的是,它们与具体实例化的测试相结合。

考虑目标 integer(X)如果 X 则失败是一个非整数项 X是一个变量。这会破坏许多理想的声明性属性:
?- X = 1, integer(X).
true.

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

理想情况下,第二个查询要么使用某种形式的协程成功;要么否则它会根据 error classification 发出实例化错误 1 .毕竟:

7.12.2 Error classification

Errors are classified according to the form of Error_term:

a) There shall be an Instantiation Error when an
argument or one of its components is a variable, and an
instantiated argument or component is required. It has
the form instantiation_error.



...

请注意,实例化测试和类型测试的这种隐式组合会导致 Prolog 程序以及 SO 中的许多错误。

解决这种情况的一个快速方法是在每个内置测试之前添加一个显式测试,或者详细地为
   ( nonvar(T) -> true ; throw(error(instantiation_error,_)) ),
integer(T), ....

或更紧凑地为
functor(T, _,_),
integer(T), ....

甚至可能
T =.. _,
integer(T), ...

我的问题是双重的:

How to provide this functionality on the user level?



而且,为了使这也有点挑战性:

What is the most compact implementation of a safer atomic/1 written in ISO-Prolog?




1 其他不太理想的选择是循环或产生资源错误。仍然比不正确的结果更可取。

最佳答案

类型测试需要将自己与传统的“类型测试”内置函数区分开来,后者也隐式地测试是否有足够的实例化。所以我们只有效地测试 充分实例化 条款(si)。如果它们没有充分实例化,则会发出适当的错误。
对于类型 nn ,因此有一个类型测试谓词 nn_si/1唯一的错误条件

a) If there is a θ and σ such that nn_si(Xθ) istrue and nn_si(Xσ) is false
instantiation_error.

atom_si(A) :-
functor(A, _, 0), % for the instantiation error
atom(A).

integer_si(I) :-
functor(I, _, 0),
integer(I).

atomic_si(AC) :-
functor(AC,_,0).

list_si(L) :-
\+ \+ length(L, _), % for silent failure
sort(L, _). % for the instantiation error
这可用作 library(si)在占卜师。
在 SWI 中,由于其在 length/2 中的不同行为,而是使用:
list_si(L) :-
'$skip_list'(_, L, T),
functor(T,_,_),
T == [].

关于prolog - Prolog 中更安全的类型测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27306453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com