Prolog树遍历

3

你好,

我正在尝试编写一个Prolog程序,该程序给定一个带有a作为functor的树:

start(a(f,2,9), X).

我希望它可以将内部任何值平方,以便产生以下结果:
X = a(f,4,81).

我已经有一个可以对列表中的数字进行平方运算的代码。 以下是我目前的代码:

start([],[]).
start(Tree, []) :- Tree =.. [P|C], write(P), nl, write(C), nl, squareMe([P|C], []).
squareMe([X|T], [Y|Result]) :-   % I think the problem is here
    atom(X),
    Y=X,
    squareMe(T, Result).
squareMe([X|T], [Y|Result]) :- 
    number(X),
    Y is X * X,
    squareMe(T, Result).
squareMe([], []).

当代码写入P和C时,通过UNIV运算符我确实可以获得正确的值,但似乎在squareMe内部出现了错误。
当我调用squareMe([P|C], [])时,我的理解是P = a且C = [f,2,9]。那么atom(a)不应该为真吗?但事实并非如此,我不确定原因是什么。
我尝试使用trace / notrace跟踪我的路径,但能否看到传递给squareMe的值将是很好的。这可能吗?我正在使用SWI-Prolog。
TIA, coson
1个回答

2

由于内容过长,我将其作为回答而不是评论。然而,我并没有完全理解你的问题。

要解决你在顶部提出的查询问题,只需编写以下代码:

start(a(f, X, Y), a(f, XX, YY)) :-
    XX is X*X,
    YY is Y*Y.

这就是它:
?- start(a(f, 2, 9), X).
X = a(f, 4, 81).

这太简单了,更重要的是,我没有看到任何树形结构,这就是我确定自己误解问题的原因。我确实有困难跟进你展示的代码。你应该编辑你的问题来解释:
- 你正在遍历哪个树形结构? - 你是使用列表、平面术语、嵌套术语(一棵树?) - 你的谓词是否需要双向工作,所以,例如,你应该能够询问:?- start(X, Y)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接