Prolog的树遍历
问题描述:
美好的一天,Prolog的树遍历
我想写给定一个树的一个仿函数Prolog的程序:
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,我通过金大运营商处获得正确的价值观,但它似乎里面squareMe要失败
。
当我调用squareMe([P | C],[]),我的理解是P = a和C = [F,2,9]。原子(a)不应该是真的吗?它似乎并非如此,我不知道为什么?
我使用跟踪/ notrace跟踪我的路试,但它肯定是高兴地看到,被传递到squareMe值。那可能吗?我正在使用SWI-Prolog。
TIA, COSON
答
这是一个答案,而不是仅仅是因为它是太长了评论;虽然我不完全了解你的问题。
要获得解决方案向您展示在上面的查询,这将是足够写:
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).
例如。