Prologue - Prise En Erreur De Syntaxe - Opérateur Devrait
Je commence à apprendre le Prologue, et je suis en cours d'exécution dans une erreur de compilation avec mon code. Je suis en train d'écrire du code qui vérifie si une famille est dans la pauvreté si elles répondent à certaines conditions. La dernière ligne quelques lignes sont la pauvreté des conditions, et c'est là que je me fais de la Opertator Expected
erreur. Je suis en train de dire que compte tenu de l'identité des membres de famille, si la taille de la famille est un, et le revenu est inférieur à 11170, alors que la famille est en situation de pauvreté. Et pour une famille de taille >8, le niveau de pauvreté est 38890 plus 3960 pour tous les autres membres de la famille. Comment puis-je corriger ces erreurs? family_in_poverty
devrait être de retour true
ou 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.
OriginalL'auteur user906153 | 2012-04-29
Vous devez vous connecter pour publier un commentaire.
Prologue de ne pas utiliser
is <=
pour une comparaison numérique, juste=<
pour moins-que-ou-égal.Lorsque vous utilisez le
is
mot-clé, c'est un infixe prédicat est/2 qui évalue la droite comme une expression numérique et unifie le résultat avec la gauche.OriginalL'auteur hardmath
Ne sais pas si cela va aider, mais essayez de le décomposer un peu plus loin, c'est à dire. une ligne pour le calcul, l'autre pour la comparaison:
Donc, la ligne du dessus est-elle défaillante ?
+Expr1 =< +Expr2 ?
c'est à dire. pensez que vos symboles sont à l'envers. À partir de swi-prolog.org/man/arith.html
Je ne l'avais pas remarqué le problème (opérateur incorrect) quand je l'ai mis dans la première solution. J'ai corrigé le code maintenant.
OriginalL'auteur magus
L'erreur doit déjà montrons ici:
Si vous n'êtes pas sûr des opérateurs de votre Prolog système prend en charge, ou les opérateurs que vous avez défini votre auto, vous pouvez lister les définitions actuelles via current_op/3. Voici un exemple typique résultat trouvé pour SWI Prolog:
Comme vous pouvez le voir il n'y a pas d'opérateur <= définies. Maintenant un Prologue système lorsqu'il rencontre une entrée de la forme "terme atome ..." et l'atome n'est pas défini comme un infixe ou postfix opérateur, il émet une erreur de syntaxe des messages "Opérateur Devrait" ou somesuch.
Ce que vous souhaitez faire est sans doute une arithmétique de comparaison. L'arithmétique de comparaison inférieur ou égal est désigné par l'opérateur =< dans le Prologue. L'opérateur est définie dans la norme ISO norme de base. Il se comporte tel que le côté gauche et le côté droit sont évalués de manière arithmétique, puis de les comparer de manière arithmétique.
Il y a un autre opérateur @=< qui n'évalue pas, et qui n'est pas une arithmétique comparaison, mais une comparaison lexicale. Dans l'arithmétique de comparaison lors de la comparaison d'un nombre entier et d'un flotteur, le nombre entier est premier élargissement à un flotteur. En comparaison lexicale le type est comparé. Donc:
En Ce Qui Concerne Meilleur
SWI Prolog Arithmétique de Comparaison:
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 Lexicale Comparaison:
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
@=<
, tous les chars sont plus petits que les nombres entiers. C'est,3.0 @=< 1
. réussit que SI, YAP, B, GNU, SICStus, XSB, Ciao. Hélas, pas dans l'IGU.SWI est très bien: ?- comparer(X,3.0,1). X = (>). ?- set_prolog_flag(iso,true). vrai. ?- comparer(X,3.0,1). X = (<). La Documentation dit: Si le Prologue du pavillon de l'iso est définie, tous les nombres à virgule flottante précéder tous les nombres entiers.
Il doit être là dès le début. Il n'existe aucune disposition dans la norme par défaut non-standard de comportement.
OriginalL'auteur j4n bur53
Simple règle-de-pouce dans le Prologue: l'inégalité pointe toujours vers le symbole égal. Exemples: =<, >=, @=< @>=, etc. Cela est différent de l'impératif des langues, où l'inégalité apparaît généralement d'abord.
OriginalL'auteur RGamboa