Tree 如何从Prolog中的术语中提取子项?

Tree 如何从Prolog中的术语中提取子项?,tree,prolog,extract,term,Tree,Prolog,Extract,Term,如何从Prolog中的术语中提取子项 举个例子,我试图在任何地方提取一个名为r的谓词,但我知道如何提取。有什么帮助吗 术语附加SN1、t3、4、r2、4、修改术语、提取术语 详情如下 修改后的术语=sn1,t3,4 ExtractedTerm=r2,4。术语的简单操作源自统一的递归定义。 那么,让我们首先从一个复合词中“提取”一个参数: exterm(T, M, E) :- T =.. [F|As], select(E, As, Bs), M =.. [F|Bs]. 此

如何从Prolog中的术语中提取子项

举个例子,我试图在任何地方提取一个名为r的谓词,但我知道如何提取。有什么帮助吗

术语附加SN1、t3、4、r2、4、修改术语、提取术语 详情如下

修改后的术语=sn1,t3,4


ExtractedTerm=r2,4。

术语的简单操作源自统一的递归定义。 那么,让我们首先从一个复合词中“提取”一个参数:

exterm(T, M, E) :-
    T =.. [F|As],
    select(E, As, Bs),
    M =.. [F|Bs].
此谓词执行大部分工作:

?- exterm(a(1,b(u)),M,E).
M = a(b(u)),
E = 1 ;
M = a(1),
E = b(u) ;
M = a(1, b),
E = u ;
false.
要概括和完成赋值,必须允许对每个参数进行递归,通过提取元素对其进行修改,并重新组合参数列表

...
append(X, [Y|Ys], As),
... % recursive call
append(X, [Z|Ys], Bs),
...
看看你是否能完成它:

?- exterm(s(n(1),t(3,4,r(2,4))),ModifiedTerm,ExtractedTerm), ExtractedTerm=r(_,_).
ModifiedTerm = s(n(1), t(3, 4)),
ExtractedTerm = r(2, 4) ;
false.

在这里,我限制提取的术语与您在问题中显示的匹配,否则将有一长串解决方案要显示…

您希望结果是什么,sn1、t3、r1、2、r3?那r1,2呢?sn1,tr1,r2呢?嗨,潜伏者,重复一遍!当然,我想让它修复一些由宽覆盖率解析器生成的解析树。关于r1,2是可以的,但是r1,r2不是因为我使用的解析器没有在彼此内部给出r谓词;然而,它可能彼此相邻。e、 g:sn1,r1,3,r4,6,7。我希望现在更清楚了。谢谢。这真的很有帮助,但我能问一下它是可以提取多个r谓词还是只提取第一个?第二,你能把第二部分写得更详细些吗?因为我不知道我在哪里可以适应外部规则。