Отрицание как сбой в Прологе и отрицание по умолчанию в наборе Ответов Пролог

Мне очень трудно понять концепцию отрицания как провала в Прологе по сравнению с отрицанием по умолчанию в Прологе набора ответов. Может кто-нибудь объяснить мне, в чем разница.

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.

Но это больше не использует Отрицание как Отказ.)

Другие вопросы по тегам