如果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).
答案 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。
希望它能对您有所帮助。