我想用推理的力量来解决以下问题。
有一天,警方在犯罪现场抓获了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'"
答案 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。