任何支持假设推理的逻辑编程都可以支持 ALP。由于 ASP 支持假设推理,它也可以支持 ALP。假设推理是一种搜索,其中暂时假设事实。
使用标准 ISO 核心 Prolog,我们可以通过以下代码模拟假设事实。代码留下了一个选择点,如果涉及到剪切,则无法正常工作,这就是为什么仍然需要专门的系统:
assumez(P) :- assertz(P).
assumez(P) :- retract(P), fail.
我们现在可以解决以下溯因问题:
abducible :- (assumez(amount(glucose,low));assumez(amount(glucose,medium))),
(assumez(amount(lactose,medium));assumez(amount(lactose,hi))).
feed(lactose) :- amount(glucose,low), amount(lactose,hi).
feed(lactose) :- amount(glucose,medium), amount(lactose,medium).
一个可能的查询运行如下:
?- abducible, feed(lactose), listing(amount/2).
amount(glucose, low).
amount(lactose, hi).
Yes;
amount(glucose, medium).
amount(lactose, medium).
Yes ;
No
上述解决方案使用反向链接。也可以提供前向链接解决方案,以及更接近 ASP 选择运算符的东西。ASP 中的选择运算符将做假设的变体,我们只使用 (;)/2 作为选择运算符:
:- use_module(library(minimal/delta)).
:- multifile abducible/0.
:- dynamic abducible/0, amount/2, feed/1.
:- forward feed/2.
post(amount(glucose,low));post(aamount(glucose,medium)) <= posted(abducible).
post(amount(lactose,medium));post(amount(lactose,hi)) <= posted(abducible).
post(feed(lactose)) <= posted(amount(glucose,low)), posted(amount(lactose,hi)).
post(feed(lactose)) <= posted(amount(glucose,medium)), posted(amount(lactose,medium)).
一个可能的查询运行如下:
?- post(abducible), feed(lactose), listing(amount/2).
amount(glucose, low).
amount(lactose, hi).
Yes ;
amount(glucose, medium).
amount(lactose, medium).
Yes ;
No