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。)
与答案集编程中的默认否定相比,我很难理解 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。)