2016-11-20 210 views
2

美好的一天,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

回答

1

这是一个答案,而不是仅仅是因为它是太长了评论;虽然我不完全了解你的问题。

要获得解决方案向您展示在上面的查询,这将是足够写:

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).例如。