Prolog演绎推理练习

时间:2018-08-28 16:37:13

标签: prolog

我对这项练习非常感兴趣:

  

写一个Prolog谓词int foo(double) { return 0; },该谓词在输入中接收规则列表deduce(R, B, B1)和事实列表R,并输出新的事实列表{{1}作为输出。通过应用B中的所有规则,直到达到固定点,从B1获得}。 B的每个规则都是通过功能符号R表示的,其中第一个参数R是条件列表,如果所有条件都经过验证,第二个参数rule(Cs, D)也为true。

例如:

Cs

我想出了一种解决方案,仅检查单个规则是否达到固定点

D

如果在第一个示例中执行它,我将得到以下结果:

?- deduce([rule([p(X), q(X)], r(X))], [p(a), p(b), q(a)], B1).
X = a, B1 = [r(a), p(a), p(b), q(a)]
?- deduce([rule([p(X), q(X)], r(X)), rule([r(Y)], q(b))], [p(a), p(b), q(a)], B1).
X = Y, Y = a, B1 = [q(b), r(a), p(a), p(b), q(a)]

现在我该如何检查deduce(rule([], _), B, B1) :- append(B, [], B1). deduce(rule([RH|RT], D), B, B1) :- findall(RH, member(RH, B), Z), deduce(rule(RT, D), B, B1). 中有两个不同的规则,但具有相同的“参数”(即检查是否存在?- deduce(rule([p(X), q(X)], r(X)), [p(a), p(b), q(a)],B1). B1 = [p(a), p(b), q(a)] B1),以及是否添加了其他规则p(a),但参数为q(a)

0 个答案:

没有答案