我想通过做一些练习来快速复习我的课程。但我没有办法解决这些问题。你能给我一个解决方案,所以当我得到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.
任何建议将不胜感激。谢谢!
答案 0 :(得分:1)
如果术语T是其自身的子项,则定义可以非常简单:
subterm(T, T).
subterm(T1, T2) :-
T2 =.. [_|As],
member(A, As),
subterm(T1, A).
无论如何,您可以看到上面的谓词实现了对树结构化术语的“懒惰”访问。