2015-01-06 2 views
0

Я пытаюсь написать правило из данной базы знаний о локальной библиотеке, которая позволит мне увидеть, написаны ли два писателя вместе.Путаница над главой правила и тело правила?

Это база знаний, которая используется.

localLib(‘AHorowitz’, ‘Stolen Gods’, 2011, ‘Scorpia Rising’, 448, 4). 
localLib(‘AHorowitz’, ‘Night Visitors’, 2000, ‘Stormbreaker’, 240, 2). 
localLib(‘AHorowitz’, ‘Matador’, 2003, ‘Eagle Strike’, 340, 6). 
localLib(‘AJohnston’, ‘Night Visitors’, 2000, ‘Stormbreaker’, 240, 2). 
localLib(‘AJohnston’, ‘Matador’, 2003, ‘Eagle Strike’, 340, 6). 
localLib(‘RMuchamore’, ‘Basic Training’, 2007, ‘The Recruit, 342, 3). 
localLib(‘MHaddon’, ‘11.’, 2004, ‘The Curious Incident Of The Dog In The Night Time’, 226, 5). 

Ключ для КБ выглядит следующим образом:

localLib(w, e, y, t, n, c) where 
w = writer’s name 
e = excerpt in text 
y = year of text 
t = title of text 
n = no. of pages in text 
c = no. of acknowledgements 

Это код, который я написал для правила:

searchlocalLib(W,E,_,_,_,_):- localLib((W1,W2),E,_,_,_,_). 

Однако я получаю очень путать, как это делает не выглядят правильно, потому что я чувствую, потому что я не описал W1 и W2 в заголовке правила, поэтому запрос не будет работать, пожалуйста, могу ли я получить некоторые рекомендации?

Также скажу, что я также хотел бы запросить ptolog, если два писателя записаны вместе через определенный год, например, 2004. Я просто вводил номер года в правило выше при исправлении?

ответ

0

Давайте примем первоначальное правило.

searchlocalLib(W,E,_,_,_,_):- localLib((W1,W2),E,_,_,_,_). 

У этого есть две основные проблемы. Во-первых, это правило предполагает, что если есть два автора одной и той же книги, тогда в записи библиотеки (localLib/6) есть кортеж с авторами в качестве первого аргумента. Это не так в вашей базе знаний, где используется только одна запись для каждого автора каждой книги:

localLib(‘AHorowitz’, ‘Night Visitors’, 2000, ‘Stormbreaker’, 240, 2). 
... 
localLib(‘AJohnston’, ‘Night Visitors’, 2000, ‘Stormbreaker’, 240, 2). 

Во-вторых, есть три одноэлементные переменные (W, W1, W2). Использование этого правила не будет создавать экземпляр переменной W. В правиле отсутствует некоторая унификация, например W = [W1, W2] (игнорируя первую проблему).

Необходимо указать на естественном языке то, что вы позже представите в Prolog, используя определенное предложение. Что-то вроде:

Авторы W1 и W2 написал книгу T вместе в Y, если есть два различных записей библиотеки год ...

Затем попытайтесь представить его, как правило, в Прологе:

twoAuthors(T, [W1, W2], Y):- 
    locallib(W1, T, Y, ...), 
    locallib(W2, T, Y, ...), 
    W1 \== W2. 

Записи, написанные после определенного года, см. this answer по аналогичному вопросу.

+0

Привет, спасибо за помощь, я пробовал этот метод, однако, когда вы вводите правило в базу знаний, он говорит, что есть ОШИБКА: Синтаксическая ошибка: Незаконный старт термина. –

+0

Это не полная реализация. Это должно дать вам подсказку о том, как это решить. –

+0

Да, я немного поиграл и смог получить ответ. Спасибо. –

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