Prolog中的失败否定和应答集编程中的默认否定
与答案集编程中的默认否定相比,我很难理解Prolog中否定是失败的概念。有人能给我解释一下区别是什么吗?马马虎虎地说: 如果你没有中彩票,你需要找份工作 序言: 好吧,我去买票 ……以后 我想我需要找份工作 ASP: 好吧,我要找份工作(因为我不知道我会中彩票) 所以,“默认否定”是默认的否,除非另有说明,而“否定为失败”是指先尝试,然后才知道失败 现在在代码中: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
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中那样直接篡改搜索策略。