Как представить неизвестное знание, которое нужно обосновать в программировании набора ответов?

Вот проблема, которую нужно решить:

Если Джим не купит игрушки для своих детей, дети Джима не получат игрушки на Рождество. Если дети Джима не напишут свои рождественские письма, Джим не купит им игрушки. Дети Джима получают игрушки на Рождество». Предположим, что предполагаемая интерпретация этой истории подразумевает, что дети Джима написали свои рождественские письма.

Теперь я хочу закодировать приведенную выше информацию в виде правил и фактов, чтобы clingo определял, писали ли письма дети Джима.

Программа, которую я пишу, выглядит следующим образом:

son(peter,jim).
receive_presents(peter,jim).
-buy_presents(jim,peter) :- son(peter,jim),
                            not write_letters(peter).
-receive_presents(peter,jim) :- not buy_presents(jim,peter).

Для простоты я просто предположил, что у Джима есть только один ребенок по имени Питер.

По моему мнению, процедура рассуждения для набора ответов будет следующей:

  1. Все факты есть в наборе ответов, т.е. son(peter,jim),receive_toys(peter,jim) обязательно должны быть в наборе ответов.

  2. Поскольку receive_toys(peter,jim) находится в наборе ответов, -receive_presents(peter,jim) не будет. Следовательно, not buy_presents(jim,peter) должно быть ложным, а buy_presents(jim,peter) находится в наборе ответов.

  3. Поскольку buy_presents(jim,peter) находится в наборе ответов, -buy_presents(jim,peter)ложно. А так как son(peter,jim) находится в наборе ответов, not write_letters(peter) будет ложным, а write_letters(peter) будет в наборе ответов.

Поэтому я думаю, что ответ должен быть {son(peter,jim),receive_toys(peter,jim),buy_presents(jim,peter),write_letters(peter)}

Таким образом, мы можем заключить, что письмо написал Петр.

Но при запуске этого в clingo я получаю следующую информацию:

clingo version 5.3.0
Reading from jim.lp
jim.lp:4:29-49: info: atom does not occur in any rule head:
  write_letters(peter)
jim.lp:5:37-60: info: atom does not occur in any rule head:
  buy_presents(jim,peter)
Solving...
UNSATISFIABLE

Models       : 0
Calls        : 1
Time         : 0.001s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.001s

Я думаю, что Clingo требует, чтобы каждая атомная операция была сначала определена в правиле. Но здесь я просто хочу рассуждать, написал ли Питер письмо, поэтому я не могу самостоятельно определить «если ххх, то Питер напишет письмо», потому что это просто становится тем, что я сам делаю часть рассуждений.

Как решить такую ​​проблему в программировании набора ответов?


person BobHU    schedule 22.11.2018    source источник


Ответы (1)


обратите внимание, что в классической логике p => q эквивалентно !q => !p. кажется, что упражнение было сформулировано в этой второй форме, поэтому все, что вам нужно сделать, это вернуть его к первой форме:

If Jim does not buy toys for his children, Jim’s children will not receive toys for Christmas

становится

If Jim’s children do receive toys for Christmas, then Jim did buy toys for his children

Второе правило:

If Jim’s children do not write their Christmas letters, Jim will not buy them toys

становится

If Jim did buy toys for his children, Jim’s children did write their Christmas letters

поэтому программа будет:

jim_did_buy_toys :- children_do_receive_toys.
children_did_write_their_christmas_letters :- jim_did_buy_toys.
children_do_receive_toys.

По-видимому, цель упражнения заключалась в том, чтобы показать, что «контрфактуальные» рассуждения такого рода можно закодировать, просто «устранив» любое отрицание с помощью законов классической логики, избегая всех хлопот, связанных с выяснением того, какой вид отрицания использовать.

person mantrid    schedule 29.11.2018
comment
Я понимаю ваше объяснение. Но в вашей программе правило children_did_write_their_christmas_letters:- jim_did_buy_toys. заключается в том, что вы сами занимаетесь рассуждениями. Что мы хотим сделать, так это позволить решателю ASP сделать это, и это мой вопрос. - person BobHU; 29.11.2018