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

Prolog 使用=。。定义谓词子项(T1,T2),prolog,Prolog,我想通过练习快速复习功课。但是我没有办法让那些练习去检查。你能给我一个解决办法吗,所以当我被绊倒的时候。我可以很快在这里找到一些指导。第一个问题描述如下。提前谢谢 问题1。我们记得,内置谓词T=。。如果T是一个项,L是包含函子和L的主要子项的列表,则满足L。 例如,f(a,g(b))=。。当L=[f,a,g(b)],且a=。。当List=[a]时,满足List 使用=。。定义当T1是T2的子项时满足的谓词子项(T1,T2)。您可以假设T1和T2没有变量。您可能还希望使用内置的谓词原子(X)或复合

我想通过练习快速复习功课。但是我没有办法让那些练习去检查。你能给我一个解决办法吗,所以当我被绊倒的时候。我可以很快在这里找到一些指导。第一个问题描述如下。提前谢谢

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

使用=。。定义当T1是T2的子项时满足的谓词子项(T1,T2)。您可以假设T1和T2没有变量。您可能还希望使用内置的谓词原子(X)或复合(X),按照以下顺序检查X是否是原子项和结构

我的解决办法是:

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

如有任何建议,将不胜感激。谢谢

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

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

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

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

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

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

我认为您不需要原子/1或复合/1,而需要成员/2。请展示您所做的尝试。一旦您陷入困境,我们将很乐意为您提供帮助。很抱歉,回复太晚。我正忙着准备一场考试。我想知道我是否有足够的时间来解决我们教授所做的所有练习。只要我有一个想法,我会把它贴在这里以获得您的指导。我认为您不需要原子/1或复合/1,而需要成员/2。请展示您所做的尝试。一旦您陷入困境,我们将很乐意为您提供帮助。很抱歉,回复太晚。我正忙着准备一场考试。我想知道我是否有足够的时间来解决我们教授所做的所有练习。只要我有一个想法,我会把它贴在这里得到你的指导。谢谢你的帮助。我觉得不经思考就直接把简单的问题贴出来很惭愧。这个问题看起来不太清楚。谢谢你的帮助。我觉得不经思考就直接把简单的问题贴出来很惭愧。这个问题看起来不太清楚。