【问题标题】:How to find a root to leaf path which is equal to a sum(pathsum problem) in Prolog?如何在Prolog中找到等于总和(路径和问题)的根到叶路径?
【发布时间】:2019-04-03 23:13:38
【问题描述】:

具体问题是:写谓词
sum(T,S)表示树T有一条从根到叶的路径,总和为S

我正在解决 Prolog 中的 pathsum 问题,但我对自己做错了什么感到困惑。

sum(T,S) :- mySum(T,S).

mySum([], S) :- S is 0.

mySum([H|T], S) :-
    nth0(X, H, Elem), 
    S1 is S-Elem,
    mySum(T, S1).

sum([1,2,3],3). is supposed to return yes/true.
sum([1,2,3] 4). is supposed to return yes/true.
sum([1,2,3] 6). is supposed to return no/false.

【问题讨论】:

  • 我在这里看不到树,只有列表?下面三个例子的逻辑是什么?它们是否以某种方式神奇地变成了树(遵循,我只能想象,一些非任意逻辑)?

标签: list tree prolog logic


【解决方案1】:

正如@User9213 所指出的,您没有给出任何树,而是列出了。

根据您的示例,树是

   1
  / \
 2   3

这将是 t(1,2,3)t(Root,Left,Right)

通常你会看到一个树遍历,它在同一个谓词中同时进行左侧和右侧,但为此你需要进行左侧或右侧,以便可以使用两个谓词,或者可以使用 ; .这个答案使用两个谓词而不是 ; 。这也需要一个基本情况来在找到叶节点时停止遍历树。

% Traverse left branch of tree
sum(t(Root,Left,_Right),[left|Path0],Sum) :-
    sum(Left,Path0,Left_sum),
    Sum is Root + Left_sum.

% Traverse right branch of tree
sum(t(Root,_Left,Right),[right|Path0],Sum) :-
    sum(Right,Path0,Right_sum),
    Sum is Root + Right_sum.

% Base case to stop traversing the tree
sum(N,[],N) :-
    N \= t(_Root,_Left,_Right).

上面的代码还包括用于产生结果的路径。即使没有要求,当树长到几级时也很高兴。

路径示例。

?- sum(t(1,2,3),Path,Sum).
Path = [left],
Sum = 3 ;
Path = [right],
Sum = 4 ;
false.

添加谓词来解决您的特定问题。

sum_1(T,V) :-
    sum(T,_Path,V).

示例运行:

?- sum_1(t(1,2,3),3).
true ;
false.

?- sum_1(t(1,2,3),4).
true ;
false.

?- sum_1(t(1,2,3),6).
false.

true 之后的false 是由于回溯,但结果正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 2022-11-04
    • 2014-02-05
    相关资源
    最近更新 更多