![](https://csdnimg.cn/release/download_crawler_static/88749656/bg4.jpg)
S. Fischer/Electronic Notes in Theoretical Computer Science 177
(
2007
)
185
因此,只允许断言和撤回基本事实。如果数据库谓词的参数不为基础,则对
assert
或
retract
的调用将挂起,直到它们为基础。请注意,目前,Curry仅通过并发合取
运算符
()
::
成功->成功->成功
类似于Concurrent Haskell [10]的Curry扩展支持并发i/o操作,可以利用此功能进行
同步。我们可以定义一个替代版本的
retract
,它不会在部分实例化的参数上挂起,
而是从数据库中删除所有匹配的事实,而不会将结果绑定传播到程序。 这些绑定
将
被 封 装 在 撤 回 的 调 用
中 。 然 而
, 这 种 行 为 可 以
使 用 下 面 定 义 的
getDynamicSolutions
来实现,更重要的是,如果对所有要收回的调用都在内部
进行封装,那么收回的
实现将变得不必要,即,对于那些不涉及自由变量的
人
能力。此 外,对于assert的实现
,似乎不存在类似的替代方案。
初看起
来,将未知部分表示为
空
值似乎是合适的。然而,如果所有的自由变量都表示为空
值,那么关于哪些变量是相同的信息就会丢失,因此,挂起或失败似乎对撤回更实
用,并且是断言的唯一合理选项
。我们
选择了suspension来支持Curry与并发相关
的可能扩展。
对持久谓词的查询可以有多个非确定性计算的解。为了封装搜索,
getDynamicSolutions
::
(a -> Dynamic)-> IO [a]
采用动态谓词抽象,并返回满足抽象的所有值的列表,类似于结果类型为Success的
谓词的
getAllSolutions
。
功能
getDynamicSolution
::
(a-> Dynamic)-> IO(Maybe a)
只能用于查询一个解决方案。请注意,如果getDynamicSolutions是惰性的,则不
需要此函数。但是在严格的实现中,所有的
解都是提前计算的,即使程序只需要结
果列表的头部。不幸的是,并非所有Curry实现都支持延迟封装
搜索,我们只能为存储在数据库中的谓词提供它。还要注意,只提供了对动态谓词
的封装访问。动态谓词不能像普通谓词那样用于防护中,因此不会导致程序的不确
定性行为。
2.2
组合持久谓词
通常需要同时从多个持久谓词查询信息,或者必须使用布尔条件限制查询。为了组
合几个持久谓词,我们提供了两种不同形式的合取。一个是组合两个Dynamic类型的
值,类似于普通约束的
function
()