Prolog 中的否定作为失败和答案集编程中的默认否定

Negation as failure in Prolog and default negation in Answer Set Programming

与答案集编程中的默认否定相比,我很难理解 Prolog 中否定作为失败的概念。有人可以向我解释一下区别是什么吗?

马虎:

没有中奖,就得找份工作!

序言:

好,我去买票!

...稍后...

我想我需要找份工作。

ASP:

好吧,我去找工作(因为我不知道我会抽奖)。

所以,"Default Negation"一个默认没有,除非知道其他,而"Negation as Failure"意味着先尝试,然后你才会知道关于失败.

现在在代码中:

win_lottery :- spend_money_on_ticket,
               fail.  % to actually win.

find_a_job.  % We can do that!

get_money :- win_lottery.
get_money :- not win_lottery, % (or \+)
             find_a_job.

ASP 响应

find_a_job get_money

Prolog 会用 true 回答 get_money,但在那之前它会回答 spend_money_on_ticket,这让你更穷。

(实际上,它甚至会为get_money的每个子句买两张票。如果它第二次赢了,那么get_money就不会成功,所以正确的 Prolog 版本是:

get_money :- win_lottery,
             !.
get_money :- find_a_job.

但这不再使用 Negation-as-Failure。)