2016-10-27 3 views
1

Ich bin neu in Prolog und arbeite gerade an einem einfachen Constraint-Programmierproblem. Also habe ich vier reelle Zahlen A, B, C, D mit der Eigenschaft, dass A + B + C + d = A B C * D = 7.11 Da es einfacher ist, mit Ganzzahl zu arbeiten, habe ich Folgendes versucht Umsetzung: Beschriftung in der Prolog-Constraint-Programmierung

:- use_module(library(clpfd)). 
    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. 

Da die oben gibt mir teilweise gelöst Antwort, habe ich versucht, das Stichwort label(Vars) am Ende setzen. Aber dies führt zu meiner Hinrichtung von grocery(V)

ERROR: Arguments are not sufficiently instantiated. 

zu produzieren Während grocery([V]) gibt mir ein false. Kann mir jemand erklären, wie man die Etikettierung durchführt? Dank

Edit: Ich habe setzen den Anruf nicht in die Bibliothek clpfd früher

+1

Bitte zeigen Sie, was Sie tatsächlich eingegeben haben. Wenn ich es versuchte, anstatt einen Fehler, bekomme ich nur keine Lösungen. – lurker

+0

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

+1

* 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

Antwort

3

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 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 und .

Verwandte Themen