Prolog - Erste Syntax-Fehler - Operator Erwartet
Bin ich angefangen zu lernen, Prolog, und ich bin in ein compiler-Fehler mit meinem code. Ich versuche, code zu schreiben, der prüft, ob eine Familie in die Armut, wenn Sie bestimmte Bedingungen erfüllen. Die Letzte Zeile zwei Zeilen sind die Armut, die Bedingungen, und das ist, wo ich immer bin Opertator Expected
Fehler. Ich bin versucht zu sagen, dass angesichts der family-ID, wenn die Größe der Familie ist, und das Einkommen ist weniger als 11170, dann, dass die Familie in Armut. Und für eine Familie Größe von >8 die Armut ist 38890 plus 3960 für jedes weitere Familienmitglied. Wie kann ich diesen Fehler korrigieren? family_in_poverty
sollte wieder true
oder false
.
family(10392,
person(tom, fox, born(7, may, 1960), works(cnn, 152000)),
person(ann, fox, born(19, april, 1961), works(nyu, 65000)),
% here are the children...
[person(pat, fox, born(5, october, 1983), unemployed),
person(jim, fox, born(1, june, 1986), unemployed),
person(amy, fox, born(17, december, 1990), unemployed)]).
family(38463,
person(susan, rothchild, born(13, september, 1972), works(osu, 75000)),
person(jess, rothchild, born(20, july, 1975), works(nationwide, 123500)),
% here are the children...
[person(ace, rothchild, born(2, january, 2010), unemployed)]).
married(FirstName1, LastName1, FirstName2, LastName2) :-
family(_, person(FirstName1, LastName1, _, _),
person(FirstName2, LastName2, _, _), _).
married(FirstName1, LastName1, FirstName2, LastName2) :-
family(_, person(FirstName2, LastName2, _, _),
person(FirstName1, LastName1, _, _), _).
householdIncome(ID, Income) :-
family(ID, person(_, _, _, works(_, Income1)),
person(_, _, _, works(_, Income2)), _),
Income is Income1 + Income2.
exists(Person) :- family(_, Person, _, _).
exists(Person) :- family(_, _, Person, _).
exists(Person) :- family(_, _, _, Children), member(Person, Children).
householdSize(ID, Size) :-
family(ID, _, _, Children),
length(Children, ChildrenCount),
Size is 2 + ChildrenCount.
:- use_module(library(lists)). % load lists library for sumlist predicate
average(List, Avg) :-
sumlist(List, Sum),
length(List, N),
Avg is Sum /N.
family_in_poverty(FamilyID) :- householdSize(FamilyID, 1), householdIncome(ID, X), X <= 11170.
family_in_poverty(FamilyID) :- householdSize(FamilyID, 2), householdIncome(ID, X), X <= 15130.
........
family_in_poverty(FamilyID) :- householdSize(FamilyID, Y), householdIncome(ID, X), X <= 38890 + (Y - 8)*3960, Y > 8.
InformationsquelleAutor user906153 | 2012-04-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Prolog nicht
is <=
für einen numerischen Vergleich, nur=<
für weniger-als-oder-gleich.Wenn Sie die
is
Stichwort, das ist ein Prädikat infix /2, wertet die Rechte Seite, wie ein numerischer Ausdruck und gleicht das Ergebnis mit der linken Seite.InformationsquelleAutor hardmath
Nicht sicher, ob dies helfen wird, aber versuchen Sie es brechen ein bisschen weiter, dh. eine Zeile für die Berechnung, ein weiteres für den Vergleich:
So, die Zeile oben ist es Versagen ?
+Expr1 =< +Expr2 ?
dh. vermute, Ihre Symbole sind der falsche Weg um. Aus swi-prolog.org/man/arith.html
Ich habe das problem aber nicht finden (falscher operator), wenn ich in der ersten Lösung. Ich habe korrigiert der code jetzt.
InformationsquelleAutor magus
Sollte der Fehler schon hier:
Wenn Sie nicht sicher sind, welche Operatoren Sie Ihr Prolog-system unterstützt werden, oder welche Operatoren Sie haben festgelegt, Ihr selbst, können Sie eine Liste der aktuellen Definitionen über current_op/3. Hier ist ein typisches Ergebnis gefunden für SWI-Prolog:
Wie Sie sehen können gibt es keinen operator <= definiert. Nun ein Prolog-system, wenn es auf eine Eingabe der form "Begriff atom ..." und atom ist nicht definiert als ein infix-oder postfix-operator, gibt es eine syntax-Fehlermeldung "Operator Erwartet" oder somesuch.
Was Sie wahrscheinlich tun möchten ist, einen arithmetischen Vergleich. Der arithmetische Vergleich weniger oder gleich ist gekennzeichnet durch den operator = "< " in Prolog. Der Betreiber ist auch definiert in der ISO-core-standard. Es verhält sich so, dass auf der linken Seite und der rechten Seite ausgewertet werden, überträgt sich rein rechnerisch und verglichen dann überträgt sich rein rechnerisch.
Gibt es einen anderen operator @=<, die nicht bewertet und nicht zu einem arithmetischen Vergleich, sondern eine lexikalische Vergleich. Im arithmetischen Vergleich, wenn der Vergleich einen integer-und eine float -, integer-zuerst weiteten sich für einen float. Im lexikalischen Vergleich der type verglichen. Daher:
Beste Grüße
SWI-Prolog-Arithmetik Vergleich:
http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%274.26%27,swi%28%27/doc/Manual/arith.html%27%29%29
SWI-Prolog Lexikalischen Vergleich:
http://www.swi-prolog.org/pldoc/doc_for?object=section%283,%274.7.1%27,swi%28%27/doc/Manual/compare.html%27%29%29
@=<
alle Schwimmer sind kleiner als Integer. Das ist3.0 @=< 1
. gelingt es, wie in IF, YAP, B, GNU, SICStus, XSB, Ciao. Ach, nicht in SWI.SWI ist in Ordnung: ?- compare(X,3.0,1). X = (>). ?- set_prolog_flag(iso,true). wahr. ?- compare(X,3.0,1). X = (<). Die Dokumentation sagt: Wenn der Prolog fahne iso definiert ist, werden alle floating-point-zahlen vor allen zahlen.
Muss es da sein, gleich von Anfang an. Es gibt keine Bestimmung in der Norm für Standard-nicht-standard-Verhalten.
InformationsquelleAutor j4n bur53
Einfache Regel-of-Daumen in Prolog: die Ungleichheit symbol zeigt immer in Richtung des Gleichheitszeichen. Beispiele: =<, >=, @=<, @>=, etc. Dies unterscheidet sich von den imperativen Sprachen, in denen die Ungleichheit symbol erscheint in der Regel zuerst.
InformationsquelleAutor RGamboa