认知描述程序(epistemic specification)是回答集程序的超集,它是为了解决asp程序不能“自省”的问题所发明的一种逻辑语言。asp的求解的复杂度已经很高,,认知描述程序的求解复杂度更高,,我们原本设计的ES实例化器效率太低,以至于很多问题都不能有效的求解出来。我们现在准备转化一个思路,将ES程序转化成一个回答集程序(实例化等价),利用现有的高效的回答集程序的实例化器求解,等实例化完成后再恢复成原来的认知描述程序(略有点trick,不像正派武功,走了点邪道,哈哈),然后再利用我们设计的求解器求出该认知描述程序的解。
废话不多说,现在就展示一下转化的方法。
<span style="font-size:10px;">初步考虑:
1. 重写带有主观字的规则
对于包含K l的规则R
1)添加新规则,避免改写规则被优化
2)使用新的逻辑程序完成实例化
2. 实例化完成后,去掉所有添加规则,并将ground_k_l重写写成K l.</span>
看一个例子吧:
%% p(X) :- K l(X).
%% l(a).
%%added rules
defined_l(X) :- l(X).
positive_l(X) :- not negative_l(X), defined_l(X).
negative_l(X) :- not positive_l(X), defined_l(X).
ground_k_l(X) :- positive_l(X).
ground_not_k_l(X) :- positive_l(X).
ground_k_l(X) :- negative_l(X).
ground_not_k_l(X) :- negative_l(X).
p(X) :- ground_k_l(X).
l(a).
l(a).
defined_l(a).
positive_l(a):-not negative_l(a).
negative_l(a):-not positive_l(a).
ground_k_l(a):-positive_l(a).
ground_not_k_l(a):-positive_l(a).
ground_k_l(a):-negative_l(a).
ground_not_k_l(a):-negative_l(a).
p(a):-ground_k_l(a).
可以看到K l(X)被正确实例化出来了,只是被改写成ground_k_l(a)了,所以下一步我们要做的就是去掉新加的规则,结果如下:
去掉的准则就是1.删除所有头部含有defined_l,positive_l,negative_l,ground_k_l和ground_not_k_l的规则,2 将体部的ground_k_l和ground_not_k_l还原成K l 和not K l
l(a).
p(a):-K l(a).
还剩下的事情就是如何证明这样做方法可以保证最后的程序与原程序语义等价。