Вот проблема, которую нужно решить:
Если Джим не купит игрушки для своих детей, дети Джима не получат игрушки на Рождество. Если дети Джима не напишут свои рождественские письма, Джим не купит им игрушки. Дети Джима получают игрушки на Рождество». Предположим, что предполагаемая интерпретация этой истории подразумевает, что дети Джима написали свои рождественские письма.
Теперь я хочу закодировать приведенную выше информацию в виде правил и фактов, чтобы 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).
Для простоты я просто предположил, что у Джима есть только один ребенок по имени Питер.
По моему мнению, процедура рассуждения для набора ответов будет следующей:
Все факты есть в наборе ответов, т.е.
son(peter,jim)
,receive_toys(peter,jim)
обязательно должны быть в наборе ответов.Поскольку
receive_toys(peter,jim)
находится в наборе ответов,-receive_presents(peter,jim)
не будет. Следовательно,not buy_presents(jim,peter)
должно быть ложным, аbuy_presents(jim,peter)
находится в наборе ответов.Поскольку
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 требует, чтобы каждая атомная операция была сначала определена в правиле. Но здесь я просто хочу рассуждать, написал ли Питер письмо, поэтому я не могу самостоятельно определить «если ххх, то Питер напишет письмо», потому что это просто становится тем, что я сам делаю часть рассуждений.
Как решить такую проблему в программировании набора ответов?