我在这个网站上读到了一些问题,但找不到其中一个回答 我的问题。
它来自prolog书,其中作者定义了程序替代 在某些术语中将所有子项替换为另一个子项,并将结果存储在Term1中。
具体来说,代码来自书中:
substitute(Term, Term, Term1, Term1):- !.
substitute(_, Term, _, Term):- atomic(Term), !.
substitute(Sub, Term, Sub1, Term1):-
Term=..[F|Args],
substlist(Sub, Args, Sub1, Args1),
Term1=..[F|Args1].
substlist(_, [], _, []).
substlist(Sub, [Term|Terms], Sub1, [Term1|Terms1]):-
substitute(Sub, Term, Sub1, Term1),
substlist(Sub, Terms, Sub1, Terms1).
所以,当我们致电substitute(5, plus(5, plus(5, 5)), plus(2, 17), X).
时,我们会回来
X = plus(plus(2,17),plus(plus(2,17),plus(2,17))).
现在回答我的问题。我们离开Term非地面,所以我们将结果存储在那里。如果我已经有一个结果,例如,Term是以plus(55, plus(4, 55))
为基础的,那么当我们用25替换2时,我想找到产生上述值的所有表达式,所以调用将是substitute(2, X, 55, plus(55, plus(4, 55)))
,我认为这会产生X = plus(2, plus(4, 2)), X = plus(2, plus(4, 55)), X = plus(55, plus(4, 2)), X = plus(55, plus(4, 55)).
。所以我想要所有通过替换获得结果的表达式。
如果您尝试使用代码,则在使用= ..内置谓词进行分解时,会获得列表的实例化错误。
编辑:
所以,我正在考虑检查Term是否为地面变量,以避免实例化错误并编写两条规则,代码现在看起来就像这样。
substitute(Term, Term, Term1, Term1):- !.
substitute(_, Term, _, Term):- atomic(Term), !.
substitute(Sub, Term, Sub1, Term1):-
\+ var(Term),
Term=..[F|Args],
substlist(Sub, Args, Sub1, Args1),
Term1=..[F|Args1].
substitute(Sub, Term, Sub1, Term1):-
\+ var(Term1),
Term1=..[F|Args1],
substlist(Sub, Args, Sub1, Args1),
Term=..[F|Args].
substlist(_, [], _, []).
substlist(Sub, [Term|Terms], Sub1, [Term1|Terms1]):-
substitute(Sub, Term, Sub1, Term1),
substlist(Sub, Terms, Sub1, Terms1).
现在,我没有得到实例化错误,但是当我想要找到所有可能的表达式时,只找到第一个,然后prolog退出,消息号为。
所以,我只想解决,现在找到所有解决方案。目前的代码:
replace1(Term, Term, Term1, Term1) :- !.
replace1(Term, _, _, Term) :- atomic(Term).
replace1(Term, Subterm, Subterm1, Term1) :-
Term1 =.. [Functor|Args],
substitute1(Args1, Subterm, Subterm1, Args),
Term =.. [Functor|Args1].
substitute1([], _, _, []).
substitute1([Term|Terms], Subterm, Subterm1, [Term1|Terms1]) :-
replace1(Term, Subterm, Subterm1, Term1),
substitute1(Terms, Subterm, Subterm1, Terms1).
结果很有意思,如果所有术语都如上所述,那么我每次都会得到相同的结果:replace1(X, 2, 17, plus(3, 17)).
X = plus(3,2) ? ;
X = plus(3,2) ? ;
当其他X
应为plus(3, 17).