Prolog中是否存在多个结论规则的语法糖?

时间:2019-05-08 14:53:00

标签: prolog

考虑以下人为设计的示例:

q(a) :- p(a), p(b).
q(b) :- p(a), p(b).

我希望能够将这样的内容作为单个Prolog声明编写,例如:

q(a), q(b) :- p(a), p(b).

动机很简单,如果一个人正在Prolog中建立一个知识库,上面有很多``多重结论''规则(如我上面的示例),那么能够在一个单一的规则上编写这样的规则将很方便行不知何故。在Prolog中有可能与此类似吗?

1 个答案:

答案 0 :(得分:1)

您可以使用术语扩展机制(由某些Prolog系统和Logtalk提供)将诸如q(a), q(b) :- p(a), p(b)之类的术语扩展为一组子句。诸如此类:

term_expansion((','(H,Hs) :- Body), Clauses) :-
    convert_to_clauses(Hs, H, Body, Clauses).

convert_to_clauses(','(H,Hs), Head, Body, [(Head :- Body)| Clauses]) :-
    !,
    convert_to_clauses(Hs, H, Body, Clauses).
convert_to_clauses(Head2, Head, Body, [(Head :- Body), (Head2 :- Body)]).

通话示例:

?- expand_term((q(a),q(b):-p(a),p(b)), L).
L = [(q(a):-p(a), p(b)),  (q(b):-p(a), p(b))].

查看Prolog系统文档,以获取有关术语扩展机制(如果不是标准机制)的详细信息。如果您需要/想要一个便携式解决方案,Logtalk的术语扩展机制在所有(12)受支持的Prolog系统中都可以使用。