Sie stehen vor zwei Probleme, die Ich mag würde separat diskutieren:
Instanziierung Fehler
Wie Sie erwähnt, erhalten wir:
?- grocery(Vs), label(Vs).
ERROR: Arguments are not sufficiently instantiated
Kennzeichnung erfordert, dass die Variablen, die la sein sollen Alle haben endliche Domains. In Ihrem Fall wirft label/1
ein instantiation-error weil die Domänen einiger Variablen noch unendlich sind:
?- grocery([A,B,C,D]).
A in inf.. -1\/1..sup,
100*A#=_9006,
_9006 in inf.. -100\/100..sup,
_9006+_9084+_9078+_9072#=711,
_9006*_9084#=_9102,
_9084 in inf.. -100\/100..sup,
100*B#=_9084,
_9102 in inf.. -1\/1..sup,
_9102*_9078#=_9222,
_9078 in inf.. -100\/100..sup,
100*C#=_9078,
C in inf.. -1\/1..sup,
_9222 in -71100000000.. -1\/1..71100000000,
_9222*_9072#=71100000000,
_9072 in -71100000000.. -100\/100..71100000000,
100*D#=_9072,
D in -711000000.. -1\/1..711000000,
B in inf.. -1\/1..sup.
Die einzige Chance, dies zu korrigieren ist eine geeignete Spezialisierung des Programms zu erstellen, in der die Variablen am Ende mit endlichen Domänen. Schreiben [Vs]
statt Vs
ist offensichtlich keine Lösung:
?- grocery(Vs), label([Vs]).
ERROR: Type error: `integer' expected, found `[_8206,_9038,_8670,_8930]' (a list)
Dies liegt daran, label/1
ihr Argument erfordert eine Liste von endlichen Bereich Variablen zu sein, nicht eine Liste von Listen.
Ein Beispiel für eine geeignet Spezialisierung sein könnte:
?- grocery(Vs), Vs ins 0..sup, label(Vs).
false.
Das resultierende Programm hat keine Lösung, aber zumindest wissen wir, dass es definitiv keine Lösung hat, denn es ist nicht mehr Instanziierung Fehler.
Keine Lösung
Wir also an einem zweiten angekommen sind, eher unabhängige Frage: Warum geht dieses resultierende Programm hat keine Lösung?
Ein wesentlicher Vorteil einer logische Programmiersprache wie Prolog ist, dass es die Anwendung von deklarativen Debuggen Ansätzen wie zum Beispiel in gupu gezeigt ermöglicht.
Wie in gupu, verwenden Sie die folgende Definition verallgemeinern entfernt Ziele:
:- op(920,fy, *).
*_.
Zum Beispiel können wir verallgemeinern entfernt das letzte Ziel des Programms:
grocery(Vars):-
Vars = [A,B,C,D],
X #= 100 * A,
Y #= 100 * B,
Z #= 100 * C,
W #= 100 * D,
X+Y+Z+W #= 711,
*X*Y*Z*W #= 71100000000.
Das resultierende Programm ist offensichtlich mehr ge Neral als das ursprüngliche Programm, weil wir eine Einschränkung von einem reinen und monotonen Prolog Programm entfernt haben.
Nun bekommen wir noch für die vorhergehende Abfrage:
?- grocery(Vs), Vs ins 0..sup, label(Vs).
false.
Und jetzt wissen wir: Auch das allgemeinere Programm hat keine Lösung.
Wenn Sie erwarten, Lösungen in diesem Fall werden Sie Änderung Teile des restlichen Programms haben die Fehler in der Formulierung zu korrigieren. Weitere Informationen zu diesem Ansatz finden Sie unter program-slicing und logical-purity.
Bitte zeigen Sie, was Sie tatsächlich eingegeben haben. Wenn ich es versuchte, anstatt einen Fehler, bekomme ich nur keine Lösungen. – lurker
Das war, was ich tatsächlich eingegeben habe. Der mit einem Fehler ist, wenn ich Etikett (Vars) setze und über Lebensmittelgeschäft (V) ausführe. – chrishendra93
* Wie * Sie eingeben "Label (Vars)" zählt. Sie sollten eingeben, 'Lebensmittelgeschäft (Vars), Label (Vars).' (Beachten Sie das Komma nach dem ersten Anruf). Das habe ich mit deinem Code gemacht und keinen Fehler bekommen, aber keine Lösung bekommen. Wenn Sie 'foody (Vars) .' mit Punkt eingeben, gefolgt von' label (Vars) .' dann weiß 'label (Vars) 'nichts über die' Vars' in der vorherigen Abfrage. Sie sind getrennt. – lurker