Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何在Prolog中找到一个根到叶的路径,它等于一个和(路径和问题)?_List_Tree_Prolog_Logic - Fatal编程技术网

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
有一个sum
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.

正如@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
是由于回溯,但结果是正确的

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