序言中的析取三段论

时间:2016-10-12 15:31:54

标签: prolog

我正在使用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中对上述两个语句建模?

1 个答案:

答案 0 :(得分:0)

afaik Prolog不会这样工作。它会尝试将您的表达式与所有语句匹配。因此,如果你想建模" a是罪犯而b不是",那么你可以写

criminal(a).
not(criminal(b)).

但是你不能说犯罪(b)而在下一行不能犯罪(犯罪(b)),因为这会导致矛盾。

我的代码的第二行('不是(刑事(b))')实际上是多余的,因为如果Prolog没有找到你的任期的任何匹配,它将导致错误,并回溯另一个解决方案。这意味着在这种情况下你可以简单地省略所有非犯罪分子的事实。

然后你可以问Prolog哪些原子知道是罪犯:

criminal(X).

它会清楚地告诉你

  

X = A

而b不是解决方案的一部分。