Prolog中的失败否定和应答集编程中的默认否定

Prolog中的失败否定和应答集编程中的默认否定,prolog,answer-set-programming,negation-as-failure,Prolog,Answer Set Programming,Negation As Failure,与答案集编程中的默认否定相比,我很难理解Prolog中否定是失败的概念。有人能给我解释一下区别是什么吗?马马虎虎地说: 如果你没有中彩票,你需要找份工作 序言: 好吧,我去买票 ……以后 我想我需要找份工作 ASP: 好吧,我要找份工作(因为我不知道我会中彩票) 所以,“默认否定”是默认的否,除非另有说明,而“否定为失败”是指先尝试,然后才知道失败 现在在代码中: win_lottery :- spend_money_on_ticket, fail. % to a

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

马马虎虎地说:

如果你没有中彩票,你需要找份工作

序言

好吧,我去买票

……以后

我想我需要找份工作

ASP

好吧,我要找份工作(因为我不知道我会中彩票)

所以,“默认否定”是默认的否,除非另有说明,而“否定为失败”是指先尝试,然后才知道失败

现在在代码中:

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\u money
,但在此之前,它将完成
把钱花在门票上,这会让你更穷

(实际上,它甚至会为
get\u money
的每个条款购买两张票。如果它第二次赢了,那么
get\u money
就不会成功,因此正确的序言版本是:

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

但这不再使用否定作为失败。)

这不是一个堆栈溢出问题。你需要对代码有问题,展示代码,解释问题,并询问如何解决问题。这类问题最好在邮件列表上提出,或者在r/prolog上的reddit上提出。prolog使用简单的搜索策略来解决查询。在Prolog中,
\+Q
导致Prolog尝试证明
Q
;如果成功,那么
\+Q
将失败,这通常会导致Prolog开始回溯并再次搜索。如果不能证明
Q
,Prolog会认为
\+Q
已经成功并继续。在ASP中,
\+Q
创建了某种约束,解算器可以使用这些约束来减少稳定模型集,但它不会像在Prolog中那样直接篡改搜索策略。