Листинг А.1. Трассировка решения задачи Р0
CLIPS> (reset)
==> f-0 (initial-fact)
==> f-1 (world (tag 1) (scope truth))
==> f-2 (statement (speaker A)
(claim F A) (reason 0) (tag 1))
CLIPS> (run)
FIRE 1 unwrap-true: f-1,f-2
Assumption:
A is a knight, so (T A) is true.
==> f-3 (claim (content F A) (reason 1)
(scope truth))
==> f-4 (claim (content T A) (reason 1)
(scope truth)) FIRE 2 contra-truth:
f-1, f-2, f-4, f-3
Statement is inconsistent if A is a knight.
<== f-3 (claim (content F A) (reason 1)
(scope truth)) <== f-4 (claim (content T A)
(reason 1) (scope truth)) <== f-1 (world (tag 1)
(scope truth)) ==> f-5 (world (tag 1)
(scope falsity)) FIRE 3 unwrap-false:
f-5, f-2 Assumption
A is a knave, so (T A) is false.
==> f-6 (claim (content NOT F A)
(reason 1) (scope falsity))
==> f-7 (claim (content F A) (reason 1) (scope falsity))
FIRE 4 not2: f-6
<== f-6 (claim (content NOT F A) (reason 1) (scope falsity))
==> f-8 (claim (content Т A) (reason 1) (scope falsity))
FIRE 5 contra-falsity: f-5, f-2, f-7, f-8
Statement is inconsistent if A is a knave.
<== f-5 (world (tag 1) (scope falsity))
==> f-9 (world (tag 1) (scope contra))
Упражнение 1
Предположим, что персонаж А утверждает: "Я всегда говорю правду". К какой категории следует отнести этот персонаж?
В такой постановке задача имеет неоднозначное решение. Предположение, что А правдолюбец, не приводит нас к противоречию. Но точно так же не приводит к противоречию и предположение, что А —лжец.
Ваша задача— модифицировать описанную выше программу таким образом, чтобы она давала заключение, что оба контекста непротиворечивы. Один из возможных вариантов модификации — ввести в состав программы правила consist-truth и consist-falsity, разработав их по образцу правил contra-truth и contra-falsity. Эти правила должны дать пользователю знать, что при данном предположении противоречий не обнаружено, причем правила должны активизироваться в случае, когда нет больше правил, претендующих на внимание интерпретатора.
Обратите внимание на то, что в задачах этого класса недостаточно убедиться, что начальное предположение об истинности некоторого высказывания не приводит к противоречию. Необходимо еще и проверить, приведет ли к противоречию обратное предположение. Если окажется, что оно также непротиворечиво, значит, задача не имеет единственного решения.