Prolog替代计划

时间:2015-10-21 13:38:13

标签: prolog

我在这个网站上读到了一些问题,但找不到其中一个回答 我的问题。

它来自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).

0 个答案:

没有答案