【问题标题】:Prolog Tree TraversalProlog树遍历
【发布时间】:2016-11-20 15:22:32
【问题描述】:

美好的一天,

我正在尝试编写一个 Prolog 程序,该程序给出一棵具有 a 函子的树:

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, 科森

【问题讨论】:

    标签: tree prolog constants evaluation


    【解决方案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).

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多