Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/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_Prolog Cut - Fatal编程技术网

Prolog 为什么';你的开场白停下来了吗?

Prolog 为什么';你的开场白停下来了吗?,prolog,prolog-cut,Prolog,Prolog Cut,我想得到这个结果: ?- numberMatrixLines(1,[[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1]],X). X = [machinePenalty(1,[1,1,1,1,1,1,1,1]), machinePenalty(2 [1,1,1,1,1,1,1,1]), machinePenalty(3,[1,1,1,1,1,1,1,1])] 我尝试以下代码: numberMatrixLines(X,[

我想得到这个结果:

?- numberMatrixLines(1,[[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1]],X).
X = [machinePenalty(1,[1,1,1,1,1,1,1,1]),
     machinePenalty(2 [1,1,1,1,1,1,1,1]),
     machinePenalty(3,[1,1,1,1,1,1,1,1])]
我尝试以下代码:

numberMatrixLines(X,[],ResultMatrix):-
   writeln('should end here'),
   reverse(ResultMatrix,ResultMatrixTemp),
   initWith(ResultMatrixTemp,ResultMatrix),
   !.
numberMatrixLines(X,[H|T],ResultMatrix):-
   append_in_front(machinePenalty(X,H),ResultMatrix,ResultMatrixTemp),
   writeln(ResultMatrixTemp),
   incr(X,X1),
   numberMatrixLines(X1,T,ResultMatrixTemp).            

incr(X, X1) :-
    X1 is X+1.                

append_in_front(X,[],[X]).
append_in_front(X,L1,[X|L1]).
当达到
numberMatrixline(X,[],ResultMatrix)
时,结果是正确的。然而,谓词不会像预期的那样停止并返回X


怎样才能让它停在那一行?

一个简单的解决方案是(我将输入列表移到第一个参数,以利用Prolog第一个参数索引,避免错误的选择点和剪切的需要):

电话示例:

| ?- number_matrix_lines([[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1]], 1, NumberLines).

NumberLines = [machine_penalty(1,[1,1,1,1,1,1,1,1]), machine_penalty(2,[1,1,1,1,1,1,1,1]), machine_penalty(3,[1,1,1,1,1,1,1,1])]
yes

另请注意,Prolog编码指南建议在谓词名称中使用下划线,而不是CamelCase。

不需要
append\u in_front/3
谓词
append_在前面(X,T,L)
L=[X | T]
相同。而且
incr/2
几乎是
succ/2
,除了
succ/2
在两个方向都起作用。如果没有看到
initWith/3
的代码,很难说,但是如果该谓词失败,那么整个过程都会失败。剪切对我来说没有什么用处,因为如果第一个子句匹配,那么第二个子句就不匹配,因为列表不能同时为空,也不能同时具有头和尾。我想你希望这一削减能很快奏效。它并没有这样做,它只是将Prolog提交给它已经做出的选择。换句话说,剪切不会对调用堆栈产生任何影响,它们会对重做堆栈产生影响。
| ?- number_matrix_lines([[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1]], 1, NumberLines).

NumberLines = [machine_penalty(1,[1,1,1,1,1,1,1,1]), machine_penalty(2,[1,1,1,1,1,1,1,1]), machine_penalty(3,[1,1,1,1,1,1,1,1])]
yes