Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.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
理解Prolog中的参数_Prolog - Fatal编程技术网

理解Prolog中的参数

理解Prolog中的参数,prolog,Prolog,这可能是一个愚蠢的问题,但在Uni,我们看到了一个将数组相乘的Prolog段。它有4个谓词,其中一个我无法理解它做什么或如何执行。你能给我一些提示或解释吗 multiply([],_,[]). multiply([V0|Rest], V1, [Result|Others]):- multiply(Rest,V1,Others), inner_product(V0,V1,Result). 我试着像这样运行谓词: multiply([1,2],3,X). multiply([[1

这可能是一个愚蠢的问题,但在Uni,我们看到了一个将数组相乘的Prolog段。它有4个谓词,其中一个我无法理解它做什么或如何执行。你能给我一些提示或解释吗

multiply([],_,[]).
multiply([V0|Rest], V1, [Result|Others]):-
    multiply(Rest,V1,Others),
    inner_product(V0,V1,Result).
我试着像这样运行谓词:

multiply([1,2],3,X).

multiply([[1,2]],[3],X).

multiply([[1,2]],3,X)

multiply([1,2],[3,2],X).
但一切都是假的


有什么地方我做错了吗?

没有给出关于所需参数类型的信息,但您可以通过查看
乘法的子句来确定:

multiply([],_,[]).
这表明第一个和第三个参数是某种类型的列表

multiply([V0|Rest], V1, [Result|Others]):-
    multiply(Rest,V1,Others),
    inner_product(V0,V1,Result).
内积
,虽然未定义为@capelic,但表示
V0
V1
是内积定义的长度相同的向量(或在序言中,标量列表)。而
结果
值将是一个标量

因此,对于
乘法(M1,V,Result)。
要成功:

  • M1
    必须是列表列表或矩阵。每个内部列表的长度必须相同,并且必须是标量值列表
  • V
    必须是一个标量值列表,其长度必须与
    M1
  • 通过递归推断,
    Result
    将是标量值的向量(列表),列表的长度将等于
    M1
    的长度(标量的数量与
    M1
    的向量数量相同)
  • 换句话说,它遵循标准矩阵/向量乘法的规则

    查看所有显示的测试用例,它们都将失败,因为它们都不符合上述3个标准

    multiply([1,2],3,X).      % Fails item #1 above
                              % `3` isn't a vector/list
    multiply([[1,2]],[3],X).  % Fails item #2 above
                              % length of [3] isn't length of [1,2]
    multiply([[1,2]],3,X)     % Fails item #2 above
                              % `3` isn't a vector/list
    multiply([1,2],[3,2],X).  % Fails item #1 above
                              % `[1,2]` isn't a list of lists (matrix)
    
    因此,它们都会因为不匹配允许谓词成功的参数的预期配置而失败

    尝试以下方法:

    multiply([[1,2,3],[3,2,1]], [1,1,1], X).
    
    你应该得到:

    X = [6,6]
    

    可能内部产品/3丢失了?。。当缺少谓词时,在乘法(..)之前使用“trace.”来查看盖子下正在做什么。@cape我知道它缺少了,我只给了你一个谓词。不是全部file@magus好的,我会牢记在心的。谢谢你的回答!你帮助我了解了Prolog的工作原理!