2015-10-06 4 views
0

Я хочу указать комментарий человека о вещи, если это положительно или отрицательно, но не может быть и тем, и другим.Как указать уникальный факт в прологе?

Я хочу поместить в мой файл общее правило, и эти факты:

:-comment(Person, Thing, B), comment(Person, Thing, OtherB), B \=OtherB. 
comment(person, book, positive). 
comment(person, book, negative). 

И когда я пытаюсь сделать запрос я получаю ошибку или что-то говорит мне что-то противоречиво.

Конечно имеют силу следующие факты:

comment(person, book, positive). 
comment(person, icecream, negativa). 
+2

* когда * вы хотите обеспечить соблюдение правила? 'комментарий (P, O, C), комментарий (P, O, D), C \ = D, throw (invalid_comment) .' – CapelliC

+0

@CapelliC он не работает, как я ожидал. Я пытаюсь поместить его в файл, так что это будет противоречиво после загрузки его в Консоль. Но это не так. – augu

ответ

1

Вы должны добавить в файл checkContradictory (по крайней мере, в gnuprolog) следующим образом:

yourfile.lp

comment(person, book, positive). 
comment(person, book, negative). 

checkContradictory:- checkCommentContradiction, ... others checking predicates 

checkCommentContradiction:-comment(Person, Thing, positive), 
      comment(Person, Thing, negative),throw(contradiction_with_comments). 

Так что, если вы хотите проверить файл перед запросом, просто выполнить свой checkContradictory или если у вас есть основной предикат, просто добавьте checkContradictory как требование.

Важно, если вам нужно иметь да безошибочны и исключение, когда есть противоречие вам нужно добавить FindAll:

yourfile.lp

comment(person, book, positive). 
comment(person, book, negative). 

checkFreeOfContradictory:- checkAllCommentsContradictions. 

checkAllCommentsContradictions:-findall(X,checkCommentContradiction,R). 

checkCommentContradiction:-comment(Person, Thing, B1), 
      comment(Person, Thing, B2), 
      (B1==B2->true;throw(contradiction_with_comments)). 

В основном потому, что тот же факт будет объединен с комментарий (Лицо, вещь, B1) и комментарий (Person, Thing, B2).

+0

Спасибо большое! Я не знал, как писать в свой КБ. :) И да, я это понимаю;) – augu

0

будет проще, если вы перестроете свои предикаты? замена одного предиката на два таким образом:

positive_comment(Person,Book). 
negative_comment(Person,Book). 

затем использовать некоторые, как

positive_comment(Person,Book):- 
negative_comment(Person,Book), 
throw_some_error, 
false. 
negative_comment(Person,Book):- 
positive_comment(Person,Book), 
throw_some_error, 
false. 

или лучше использовать отдельные проверки:

check_comments_consistency(Person,Book):- 
    positive_comment(Person,Book), 
    negative_comment(Person,Book), 
    throw_some_error. 

... или что-то подобное.

у вас есть идея?

+0

Да, я знаю. Но что, если я хочу задать третье мнение (например: нерешительный).И если я пытаюсь сделать то же самое с другими предикатами, это будет NumberOfPredicates * PossiblesValues ​​ – augu

+0

, у вас будет не более log2 (N) простых предикатов, представляющих сложный предикат (N - количество разных мнений). подумайте об этом как о кодировании пути в каком-либо дереве решений. – 4KCheshireCat

+0

https://en.wikipedia.org/wiki/Venn_diagram любая многозначная сложная логика может быть закодирована вручную в логической логике. и после этого упрощается формально. – 4KCheshireCat

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