检查Prolog中的发生情况

时间:2014-12-18 09:22:07

标签: prolog

如果Prolog变量occurs(Var, Term)出现在Prolog术语Var中,我想写一个成功的谓词Term,否则就失败了。

% occurs(Var, Term)

?- occurs(X, f(X)).
true.

?- occurs(X, f(Y)).
false.

?- occurs(X, f(a,g(b,h(X,c),d))).
true.

我正在考虑这样的事情,但如果可能的话我想要另一种解决方案:

occurs(X,Y):- contains_term(X,Y).

3 个答案:

答案 0 :(得分:2)

一个更好的名称,可以澄清你想要的东西

occurs_in(Var, Term)

许多方法可以使用与var_in_vars/2相同的技术。

这适用于任何符合ISO标准的系统。它也可能非常有效;也就是说,(在最好的情况下)独立于Term的大小。

occurs_in(Var, Term) :-
   \+ subsumes_term(Var, Term).

只要您没有任何约束,下一步就是好的:

occurs_in(Var, Term) :-
   \+ unify_with_occurs_check(Var, Term).

如果您坚持使用contains_term/2 - (名称term_subterm/2会更合适):<​​/ p>

occurs_in(Var, Term) :-
   once( ( contains_term(Term, Subterm), Var == Subterm ) ).

或者,考虑到Prolog的迷信:

occurs_in(Var, Term) :-
   \+ \+ ( contains_term(Term, Subterm), Var == Subterm ).

答案 1 :(得分:0)

I。用=。将术语转换成列表。遍历列表

a。检查Head是否为Term = ..

b。头== Var?

我使用elemSplit检查Head是否存储了其他原子

elemSplit(X,Out):- nonvar(X), X =.. Y, Y \== [X],
                              append(Y,[],Out), !, true.
elemSplit(_,_):- !, fail.

答案 2 :(得分:0)

这是我解决问题的方式:

member1(H, [H|_]):-!.

member1(X,[H|T]):-
    atomic(H),!,
    member1(X,T).

member1(X,[H|_]):-
    member1(X,H).

member1(X,[_|T]):-
    member1(X,T).

member1(x, [a,[b,[x,c],d]]).

我将使用列表而不是函数。 在这种情况下,如果变量是深度列表中的成员,则谓词返回true,否则返回false。

希望它能对您有所帮助。