如何在prolog中指定一个独特的事实?

时间:2015-10-06 13:42:12

标签: prolog unique

我想指定一个人关于某事物的评论,如果是积极的或消极的,但不能两者兼而有之。

我想在我的文件中加入一般规则和这些事实:

:-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 个答案:

答案 0 :(得分: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)评论(人,事,B2) 统一。

答案 1 :(得分:0)

如果重构谓词会更容易吗? 以这种方式将一个谓词替换为两个:

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.

或更好地使用单独的检查器:

init()

......或类似的东西。

你明白了吗?