Как представить неизвестные знания, которые необходимо обосновать в Программе набора ответов? - PullRequest
0 голосов
/ 22 ноября 2018

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

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

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

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

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) имеет значение false.И поскольку 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

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

Как решить этот видпроблема в программировании набора ответов?

1 Ответ

0 голосов
/ 29 ноября 2018

обратите внимание, что в классической логике 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.

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

...