考虑以下人为设计的示例:
q(a) :- p(a), p(b).
q(b) :- p(a), p(b).
我希望能够将这样的内容作为单个Prolog声明编写,例如:
q(a), q(b) :- p(a), p(b).
动机很简单,如果一个人正在Prolog中建立一个知识库,上面有很多``多重结论''规则(如我上面的示例),那么能够在一个单一的规则上编写这样的规则将很方便行不知何故。在Prolog中有可能与此类似吗?
答案 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系统中都可以使用。