prolog中的二进制逻辑

时间:2016-10-12 17:20:43

标签: prolog

我想用推理的力量来解决以下问题。

有一天,警方在犯罪现场抓获了3人a,b,c。当警方安排询问他们时:

i) a says I am innocent
ii) b says a is criminal
iii) c says I am innocent.

众所周知

i) Exactly one person speaks true.
ii) Exactly one criminal is there.

谁是罪犯? 在First Order逻辑中模拟上述问题: 考虑c / 1是谓词返回true,当参数为Criminal时 我们可以写:

(not(c(a)),c(c)) ; (c(c),c(a)).
 c(a); c(b); c(c).
(not(c(a)),not(c(b))) ; (not(c(a)),not(c(c))) ; (not(c(b)),not(c(c))).

在prolog中对上述语句进行建模后,我将查询:

?-c(X).
it should return:
X=c.
But error I got:
"No permission to modify static procedure `(;)/2'"

1 个答案:

答案 0 :(得分:1)

由于PROLOG确实适用于Horn条款,因此您需要head :- tail形式的内容,将:-视为" if。"

solve(Solution) :- ...
%With a Solution looking something like: 
% solve(a(truth,innocent),b(false,criminal),c(false,innocent)).

要使用生成和测试方法,这是解决此问题的常用方法,您可以执行以下操作:

solve(Solution) :-
  Solution = [a(_,_),b(_,_),c(_,_)],
  generate(Solution), 
  validate(Solution).

generate应该为您提供格式正确的Solution,也就是说,所有变量都填入了一些有意义的值(即false, true, criminal, innocent)。

validate应确保解决方案符合您提供的约束。

solve仅在generate个解决方案之一超过validate约束时完成。

有关生成和测试方法的介绍,请参阅this tutorial

但如果您正在编写不是Horn子句的代码,您可能需要编写PROLOG函数(OK,关系)的教程,如this one