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_Prolog - Fatal编程技术网

List 基于两表Prolog的算法

List 基于两表Prolog的算法,list,prolog,List,Prolog,所以我有一个硬件问题,我已经工作了几天,我被困在最后一部分。在Prolog中,我应该编写一个包含两个列表的函数 ((x1,x2,…,xn),(y1,y2,…,yn)) 并找出两者之间的距离。输出是在列表上完成的数学运算的结果。 公式:sqrt((x1-y1)(x1-y1)+(x2-y2)(x2-y2)+…+(xn-yn)*(xn-yn)) 以下是我目前掌握的情况: distance([],[], 0). distance([Ha|Ta],[Hb|Tb], Sum) :- distance(

所以我有一个硬件问题,我已经工作了几天,我被困在最后一部分。在Prolog中,我应该编写一个包含两个列表的函数 ((x1,x2,…,xn),(y1,y2,…,yn)) 并找出两者之间的距离。输出是在列表上完成的数学运算的结果。 公式:sqrt((x1-y1)(x1-y1)+(x2-y2)(x2-y2)+…+(xn-yn)*(xn-yn)) 以下是我目前掌握的情况:

distance([],[], 0).
distance([Ha|Ta],[Hb|Tb], Sum) :-
   distance(Ta,Tb, Rest),
   Sum is sqrt( (Ha-Hb)*(Ha-Hb)) + Rest.

离这儿很近。在我的头顶上,只需对平方进行求和(
distance_aux
),然后返回累计和的平方根:

distance(L1, L2, D) :-
        distance_aux(L1, L2, SQSUM),
        D is sqrt(SQSUM).

distance_aux([],[],0).
distance_aux([Ha|Ta],[Hb|Tb], Sum) :-
   distance_aux(Ta,Tb, Rest),
   Sum is (Ha-Hb)*(Ha-Hb) + Rest.

您还可以添加简化规则
距离([],[],[],0)。
,尽管它不是必需的。

它非常接近。在我的头顶上,只需对平方进行求和(
distance_aux
),然后返回累计和的平方根:

distance(L1, L2, D) :-
        distance_aux(L1, L2, SQSUM),
        D is sqrt(SQSUM).

distance_aux([],[],0).
distance_aux([Ha|Ta],[Hb|Tb], Sum) :-
   distance_aux(Ta,Tb, Rest),
   Sum is (Ha-Hb)*(Ha-Hb) + Rest.
您还可以添加简化规则
距离([]、[]、0)。
,尽管它不是必需的。

Prolog有列表,而不是数组

您的代码没有实现所示的公式,因为
sqrt
必须在乘积和之后计算。在下面的代码中,我还引入了累加器,使循环尾部递归(更高效)

根据Prolog库的不同,代码可能更简单:

distance(Xs, Ys, Dist) :-
    foldl(distpoint, Xs, Ys, 0, Sq),
    Dist is sqrt(Sq).
distpoint(X, Y, S, D) :- D is S+(Y-X)*(Y-X).
Prolog有列表,而不是数组

您的代码没有实现所示的公式,因为
sqrt
必须在乘积和之后计算。在下面的代码中,我还引入了累加器,使循环尾部递归(更高效)

根据Prolog库的不同,代码可能更简单:

distance(Xs, Ys, Dist) :-
    foldl(distpoint, Xs, Ys, 0, Sq),
    Dist is sqrt(Sq).
distpoint(X, Y, S, D) :- D is S+(Y-X)*(Y-X).

您给出的公式是对整个求和进行平方运算,而不是对每一对进行平方运算,这就是您在代码中所做的。使用辅助工具可以解决该问题:

distance_sum([], [], 0).
distance_sum([Ha|Ta], [Hb|Tb], Sum) :-
   distance_sum(Ta, Tb, Rest),
   Sum is ((Ha-Hb) * (Ha-Hb)) + Rest.

distance(A, B, Sum) :- distance_sum(A, B, DSum), Sum is sqrt(DSum).
例如:

distance([1,2,3], [4,5,6], Sum).
Sum = 5.196152422706632.
工作:

sqrt( (1-4)*(1-4) + (2-5)*(2-5) + (3-6)*(3-6) )
sqrt( 3*3 + 3*3 + 3*3 )
sqrt( 27 )
5.19615

您给出的公式是对整个求和进行平方运算,而不是对每一对进行平方运算,这就是您在代码中所做的。使用辅助工具可以解决该问题:

distance_sum([], [], 0).
distance_sum([Ha|Ta], [Hb|Tb], Sum) :-
   distance_sum(Ta, Tb, Rest),
   Sum is ((Ha-Hb) * (Ha-Hb)) + Rest.

distance(A, B, Sum) :- distance_sum(A, B, DSum), Sum is sqrt(DSum).
例如:

distance([1,2,3], [4,5,6], Sum).
Sum = 5.196152422706632.
工作:

sqrt( (1-4)*(1-4) + (2-5)*(2-5) + (3-6)*(3-6) )
sqrt( 3*3 + 3*3 + 3*3 )
sqrt( 27 )
5.19615

的确习惯了Erlang,我有时会忘记你必须使用两个累加器,而在Erlang你只能使用一个。真的!习惯了Erlang,我有时会忘记你必须使用两个累加器,而在Erlang你只能使用一个累加器。我添加了一个辅助功能,它工作得很好。谢谢你的快速回复:-)啊,好的,我知道出了什么问题。我添加了一个辅助功能,它工作得很好。感谢您的快速回复。ne:-)