我对这项练习非常感兴趣:
写一个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)
?