Отрицание как сбой в Прологе и отрицание по умолчанию в наборе Ответов Пролог
Мне очень трудно понять концепцию отрицания как провала в Прологе по сравнению с отрицанием по умолчанию в Прологе набора ответов. Может кто-нибудь объяснить мне, в чем разница.
1 ответ
Sloppyly:
Если вы не выиграли в лотерею, вам нужно устроиться на работу!
Пролог:
Хорошо, я собираюсь купить билет!
...потом...
Я думаю, мне нужно устроиться на работу.
ASP:
Хорошо, я собираюсь найти работу (потому что я не знаю, буду ли я участвовать в лотерее).
Таким образом, "Отрицание по умолчанию " по умолчанию no, если не известно иначе, в то время как "Отрицание как сбой" означает сначала попробовать, только тогда вы узнаете об ошибке.
А теперь в коде:
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
не удалось бы, поэтому правильная версия Prolog:
get_money :- win_lottery,
!.
get_money :- find_a_job.
Но это больше не использует Отрицание как Отказ.)