2016-10-12 3 views
0

Я хочу решить следующую проблему, используя вывод пролога пролога.Двоичная логика в прологе

Один день, 3 человека, a, b, c были пойманы полицией на месте преступления. Когда полиция оседлые допрашивать их:

i) a says I am innocent 
ii) b says a is criminal 
iii) c says I am innocent. 

Его известно, что

i) Exactly one person speaks true. 
ii) Exactly one criminal is there. 

Кто преступник? Для моделирования выше проблемы в логике первого порядка: Рассмотрим с/1 предикат возвращает истину, если аргумент Уголовная мы можем написать:

(not(c(a)),c(c)) ; (c(c),c(a)). 
c(a); c(b); c(c). 
(not(c(a)),not(c(b))) ; (not(c(a)),not(c(c))) ; (not(c(b)),not(c(c))). 

После моделирования выше утверждений в прологе, я запрос:

?-c(X). 
it should return: 
X=c. 
But error I got: 
"No permission to modify static procedure `(;)/2'" 
+1

Вы пишете произвольные формулы, но Prolog принимает только формулы Хорна, т. Е. Формы '' 'fact'''' или' '' head: - goal1, goal2, goal3.'''. Это также довольно запутанно, что у вас есть человек '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. –

+0

@ lambda.xy.x Я пытаюсь написать nl1: «ровно один среди а, б, говорит правда» в ВОЛП: «(не (преступник (а)), преступное (с)) (преступный (c), преступник (a)) ». и NL2: «точно один из числа a, b, c является преступным» в FOL: «уголовное преступление (a), уголовное преступление (b), уголовное преступление (c). (не (уголовное преступление (a)), а не (уголовное преступление (б))) (не (уголовное (а)), а не (уголовное (с))) (не (уголовное (б)), а не (уголовное (с))) ». Как мы можем выразить это в формулах рога, чтобы он стал синтаксически правильной пролог-программой, сохраняя при этом семантическую идентичность? – user2976975

+0

Вы пытаетесь напрямую перевести формулу, которая не работает так хорошо (например, чтобы предикат-преступник (X) имел только одно решение, вам нужно было бы написать «преступник (X) -> не существует Y: другое (Y, X), преступный (Y) ")[email protected] уже указывает вам в правильном направлении, делая ваше пространство состояний явным. –

ответ

1

Поскольку PROLOG действительно работает с предложениями Хорна, вам понадобятся элементы формы head :- tail, считая :- как «если».

solve(Solution) :- ... 
%With a Solution looking something like: 
% solve(a(truth,innocent),b(false,criminal),c(false,innocent)). 

Чтобы использовать генерировать и метод тестирования, который является общим и разумным способом решить эту проблему, вы могли бы сделать что-то вроде этого:

solve(Solution) :- 
    Solution = [a(_,_),b(_,_),c(_,_)], 
    generate(Solution), 
    validate(Solution). 

generate должен дать вам хорошо сформированную Solution , т. е. один имеет все переменные, заполненные значениями, которые делают какой-то смысл (то есть false, true, criminal, innocent).

validate должен гарантировать, что решение соответствует ограничениям, которые вы дали.

solve только завершает работу, когда один из решений generate проезжает мимо validate.

Для ознакомления с методом генерации и тестирования см. this tutorial.

Но если вы пишете код, который не является предложениями Horn, вам может потребоваться учебник по написанию функций PROLOG (OK, отношения), например this one.

Смежные вопросы