List 如何在Prolog中找到一个根到叶的路径,它等于一个和(路径和问题)?
具体问题是:编写谓词List 如何在Prolog中找到一个根到叶的路径,它等于一个和(路径和问题)?,list,tree,prolog,logic,List,Tree,Prolog,Logic,具体问题是:编写谓词 sum(T,S)表示树T有一个sumS的根到叶路径 我正在解决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(T,S)
表示树T
有一个sumS
的根到叶路径
我正在解决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.
正如@User9213所指出的,您没有给出任何树,而是列表 根据你的例子,这棵树是
1
/ \
2 3
这将是t(1,2,3)
和t(根,左,右)
通常,您会看到一个树遍历,它在同一谓词中同时执行左谓词和右谓词,但为此,您需要执行左谓词或右谓词,以便可以使用两个谓词,或代码>可以使用。这个答案使用两个谓词,而不是代码>。此外,这还需要一个基本情况,以便在找到叶节点时停止遍历树
% 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
是由于回溯,但结果是正确的 我在这里看不到树,只有列表?下面三个例子的逻辑是什么?它们是否以某种方式神奇地变成了树(我只能想象,遵循一些非任意逻辑)?