使用= ..定义谓词子项(T1,T2)

时间:2013-07-27 21:37:12

标签: prolog

我想通过做一些练习来快速复习我的课程。但我没有办法解决这些问题。你能给我一个解决方案,所以当我得到stucke。我可以在这里找到一些指导。第一个问题如下所述。提前谢谢。

问题1。我们记得,如果T是一个项,则内置谓词T = .. L,L是包含L的算子和主要子项的列表。 例如,当L = [f,a,g(b)]和a =时,满足f(a,g(b))= .. L。当List = [a]时,满足List。

使用= ..来定义当T1是T2的子项时满足的谓词子项(T1,T2)。您可以假设T1和T2没有变量。您可能还想使用内置谓词atomic(X)或compound(X)来检查X是否是原子项和结构,按此顺序。

我的解决方案是:

subterm(X,[X]):-atom(X),!.
subterm(T1,T2):-
compound(T1),
T1=..U,
U=[X|Y],
T2=Y.

任何建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

如果术语T是其自身的子项,则定义可以非常简单:

subterm(T, T).
subterm(T1, T2) :-
  T2 =.. [_|As],
  member(A, As),
  subterm(T1, A).

无论如何,您可以看到上面的谓词实现了对树结构化术语的“懒惰”访问。