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