Ich arbeite mit Matrix, wobei jede sublist eine Zeile:Prolog Matrixspalt Behandlung
Matrix =[[-,-,-,-,a,-],
[-,-,-,-,b,-],
[-,-,-,-,a,-],
[-,-,-,-,d,a],
[-,-,-,-,a,a],
[-,-,a,a,a,a],
[-,-,-,-,d,a]].
Mein Ziel zu finden ist, wenn vier aufeinanderfolgende Positionen in einer Unterliste mit dem gleichen Charakter sind, die gesendet.
veryRow(_,[]).
veryRow(X,[T|TS]) :- row(X,T), veryRow(X,TS).
row(X,[A,B,C,D|_]) :- A \= X; B \= X; C \= X; D \= X.
row(X,[_|Xs]):- row(X,Xs).
Muss True zurückgegeben werden, wenn eine Unterliste vier aufeinander folgende Elemente.
meine Inputs ist:
veryRow(a,[[-,-,-,-,a,-],
[-,-,-,-,b,-],
[-,-,-,-,a,-],
[-,-,-,-,d,a],
[-,-,-,-,a,a],
[-,-,a,a,a,a],
[-,-,-,-,d,a]]).
Da nicht gefunden?
Dank
'veryRow 'wird fehlschlagen, sobald eine Zeile gefunden wird, die für' row' nicht erfolgreich ist. – lurker
aber mit dem Schnitt „!“. Stoppt die Ausführung nicht, wenn Row wahr ist? – Merche
So weit kommt es nie. Der Schnitt verhindert nur das Zurückverfolgen von mehr Solutinen * wenn * der Aufruf von 'row' erfolgreich ist. Für die erste Zeile in der zweiten Argument 'veryRow (X, [T | TS])' schlägt fehl, da 'T' nicht über 4 aufeinanderfolgende' X's. Und 'veryRow (_, [])' schlägt fehl, weil das zweite Argument nicht die leere Liste ist. Das Prädikat schlägt also vollständig fehl. Ihre Logik für 'veryRow' erfordert, dass' row' erfolgreich ist. – lurker