我正在使用swi-prolog。我想在程序中模拟以下语句。 “a或b都是犯罪.b不是犯罪。”
对这些陈述进行建模后。以下查询应该有效。
?-c(X).
X=a.
但是, 当我在prolog中写上面的陈述时:
c(a);c(b).
not(c(b)).
此代码无法编译并显示错误:
No permission to modify static procedure `(;)/2'
如何在prolog中对上述两个语句建模?
答案 0 :(得分:0)
afaik Prolog不会这样工作。它会尝试将您的表达式与所有语句匹配。因此,如果你想建模" a是罪犯而b不是",那么你可以写
criminal(a).
not(criminal(b)).
但是你不能说犯罪(b)而在下一行不能犯罪(犯罪(b)),因为这会导致矛盾。
我的代码的第二行('不是(刑事(b))')实际上是多余的,因为如果Prolog没有找到你的任期的任何匹配,它将导致错误,并回溯另一个解决方案。这意味着在这种情况下你可以简单地省略所有非犯罪分子的事实。
然后你可以问Prolog哪些原子知道是罪犯:criminal(X).
它会清楚地告诉你
X = A
而b不是解决方案的一部分。