2016-11-20 4 views
0

Ich machte eine Funktion, die Vektorlänge und 2D-Array-Größe berechnet.Prolog '==' Operator funktioniert nicht?

Unten ist die Funktion. Ich verwende swi-prolog:

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2), 
write("vector len : "), write(COUNT1), 
write(", 2D array size : "), write(COUNT2). 

Ja, ich absichtlich detaillierte listLength, twoDarray Funktion ausschließen.

Allerdings sind zwei Funktionen korrekt. So, COUNT1 Variable speichert Vektor Länge und COUNT2 Variable speichert 2D-Array-Größe.

Auch Eingabevariable LIST bedeutet Vektor. 2-dimensionale Tabelle ist festgelegt. (7 x 7).

Wenn ich laufe, den Code mit dem Eingang:

- foo ([1, 2, 3, 4, 5]).

es Ausgänge:

Vektor len: 5, 2D-Array-Größe: 49

result(1)

Aber, wenn ich oben Code wie nachstehend modifiziert,

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2), 
(COUNT1 == COUNT2). 

Funktion ist nicht beendet. Mein Ziel ist vergleichen und COUNT2. Wenn zwei Variablen identisch sind, wird true zurückgegeben, andernfalls wird false zurückgegeben.

Allerdings funktioniert es nicht mit dem gleichen Eingang.

result(2)

Was ist der Grund dafür, und wie kann ich es beheben?

Antwort

0

Da der Prolog-Interpreter bei fehlgeschlagenem Ziel einen Backtrack durchführt, versucht er twoDarray/1 erneut, falls er einen anderen Wert für COUNT2 zurückgibt. Standardmäßig haben Prolog-Beziehungen mehrere Antworten. Sie müssen Prolog Maschine sagen, dass eine bestimmte Beziehung eine Funktion ist, das heißt, es gibt nur eine Antwort.

Um festzustellen, ob eine Relation funktioniert, können Sie den Operator cut verwenden. Wenn Sie die Definitionen von twoDarray/1 und listLength/2 nicht ändern möchten, können Sie cut direkt in Ihre Definition von foo/1 einfügen. Der ausgeschnittene Operator wird durch das Ausrufezeichen gekennzeichnet.

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2),!, 
(COUNT1 == COUNT2). 
0

Der folgende Code

listLength(_, 5). 
twoDarray(49). 

foo(LIST) :- 
    listLength(LIST, COUNT1), 
    twoDarray(COUNT2), 
    (COUNT1 == COUNT2). 

Arbeit (sofort Fehler zurück) mit meinem gprolog und mit meinem swi-prolog.

Also, ich nehme an, das Problem ist in Ihrem listLength/2 oder in Ihrem twoDarray/1.

Vorschlag: Ersetzen Sie Ihre listLength/2 durch meine gefälschte und versuchen Sie es erneut.

Nächster Versuch mit meiner gefälschten twoDarray/1.