【发布时间】:2021-08-07 13:01:27
【问题描述】:
标准术语顺序仅将变量作为句法对象。因此,beside other problems、sort/2 打破了关系定义的常见假设。答案替换既不能保证解决方案,也不能对第二个参数的地面实例进行排序。
?- X = 1, sort([1,X],[1]).
X = 1.
?- sort([1,X],[1]). % generalization fails
false.
?- sort([1,X],[2,1]).
X = 2. % unsorted list succeeds
?- X = 2, sort([1,X],[2,1]). % answer substitution fails
false.
但是即使我们忽略了声明性问题,我们仍然面临着变量排序仅在创建排序列表期间保持不变的问题。所以根据我们得到的变量的“年龄”
?- _=X+Y, sort([X,Y],[2,1]).
X = 2, Y = 1.
?- _=Y+X, sort([X,Y],[2,1]).
Y = 2, X = 1.
而且年龄可能会随着时间而改变,甚至是相对年龄。
我们真的应该受到所有这些古怪行为的保护。
到目前为止,我尝试的是一个安全的定义,它会产生与sort/2 完全相同的类型错误,但是当要排序的列表不接地时会产生实例化错误。只要不发生实例化错误,这个定义确实是完美的。
sort_si(List, Sorted) :-
sort(List, ISorted),
( sort([], [_|Sorted]) ; true ), % just to get the type_error
( ground(ISorted)
-> Sorted = ISorted
; throw(error(instantiation_error, _Imp_def))
).
?- sort_si([X,X],S).
caught: error(instantiation_error, _97) % unexpected; expected: S = [X]
?- sort_si([-X,+Y], S).
caught: error(instantiation_error, _97) % unexpected; expected: S = [+Y,-X]
?- sort_si([_,_], []).
caught: error(instantiation_error, _97) % unclear, maybe failure
我的问题是:如何通过减少不必要的实例化错误的数量来改进 ISO Prolog 中的定义?理想情况下,仅当目标 sort(List, Sorted) 的实例具有不同的结果时,才会发生 sort_si(List, Sorted) 的实例化错误。不需要最佳数量的实例化错误。也许在某种程度上可以使用列表ISorted 排序的事实。
而且,Sorted 也可以考虑,因为现在Sorted 将永远不会有未排序的地面列表解决方案。
【问题讨论】:
标签: prolog iso-prolog