我想指定一个人关于某事物的评论,如果是积极的或消极的,但不能两者兼而有之。
我想在我的文件中加入一般规则和这些事实:
:-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).
答案 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()
......或类似的东西。
你明白了吗?