Небрежно:
Если вы не выиграли в лотерею, вам нужно получить работу!
Пролог :
Хорошо, я куплю билет!
... позже ...
Полагаю, мне нужно устроиться на работу.
ASP :
Хорошо, я собираюсь найти работу (потому что я не знаю что я буду участвовать в лотерее).
Итак, «Отрицание по умолчанию» 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
Пролог ответит get_money
сtrue
, но до тех пор он будет делать spend_money_on_ticket
, что делает вас беднее.
(На самом деле, он даже купит два билета на каждый пункт get_money
. И если бы он выиграл во второй раз, то get_money
не удалось бы, поэтому правильная версия Prologis:
get_money :- win_lottery,
!.
get_money :- find_a_job.
Но это больше не использует Negation-as-Failure.)