【发布时间】:2014-03-03 19:23:16
【问题描述】:
我在 Prolog 中有两个谓词,第一个确实返回两个列表(带 w/e 的向量)的正确点积……第二个是当您将列表乘以列表(矩阵)列表时,它将返回一个列表。当我尝试传递诸如([1,2],[[3,4],[5,6],[7,8]], X) 之类的东西时,第二个失败了。任何精通Prolog的人都看到我的错误吗?我有点卡住了,因为跟踪和序言本身总是返回失败。
getDotProd([],[],0.0).
getDotProd([H1|T1],[H2|T2], N):-
getDotProd(T1,T2,N1),
N is N1 + (H1 * H2).
vecTimesMatrix(_,[[]],[]).
vecTimesMatrix([List], [MH|Mtail],[N]):-
N is getDotProd(List, MH, _),
vecTimesMatrix(List, Mtail, N).
到目前为止更新的代码:
getDotProd([],[],0.0).
getDotProd([H1|T1],[H2|T2], N):-
getDotProd(T1,T2,N1),
N is N1 + (H1 * H2).
vecTimesMatrix([],[[]],[]).
vecTimesMatrix([List], [MH|Mtail],[N]):-
getDotProd(List, MH, N),
vecTimesMatrix(List, Mtail, N).
【问题讨论】:
-
你有两个问题。一个是
N is getDotProd...,你的意思是getDotProd(List, MH, N)。另一个是getDotProd的两个规则没有相同的数量:第一个有四个参数,第二个有三个。 -
是的,我修好了,我的笨蛋哈哈。感谢您的输入,所以就像我在第二个谓词中调用 getDotProd 时一样,我只是传递一个 N 而不是将 N 设置为谓词?我已经不太喜欢 prolog 了:/ .
-
Prolog 是为符号计算而设计的。如果您尝试实现symbolic differentiation 而不是线性代数,我保证您会获得更多乐趣。如果这里的目标是享受 Prolog 的乐趣,我会选择一个不同的问题;如果这里的目标是做矩阵数学,我会选择另一种语言——可能是Octave 或Julia。
-
知道了,是的,到目前为止所做的更改在 vecTimesMatrix 的第一个谓词中添加了 [] 而不是 _ 并将另一行固定为 getDotProd(List,MH,N) .. 仍在跟踪中它似乎接受了第一个电话然后爬行一次并在下一次失败。不过,我今天会继续玩它。如果我有选择的话,我会用 C 或 C++ 来做这件事。
-
@user3376151 Prolog 的新手不喜欢该语言的主要原因是他们认为它应该像他们熟悉的其他语言一样,但只是有自己的曲折。然而,在使用 Prolog 时,最好检查一下你所知道的关于其他语言如何工作的所有信息,并了解 Prolog 作为一种关系语言是如何工作的。然后你就可以更有效地把它应用到你的线性代数问题上,正如丹尼尔所说,真的很喜欢它擅长的那些问题。