我开始学习Prolog,而且我的代码遇到编译错误。我正在尝试编写一些代码,以检查一个家庭是否满足某些条件是否处于贫困状态。最后几行是贫困状况,这就是我得到Opertator Expected
错误的地方。我想说的是,考虑到家庭身份证,如果这个家庭的规模是一个,收入低于11170,那么这个家庭就处于贫困状态。对于一个大小> 8的家庭,每增加一个家庭成员,贫困水平为38890加3960。我该如何纠正这些错误? family_in_poverty
应该返回true
或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.
答案 0 :(得分:3)
Prolog不会使用is <=
进行数字比较,只使用=<
进行小于或等于。
当您使用is
关键字时,这是一个中缀谓词是/ 2 ,它将右侧评估为数值表达式,并将结果与左侧统一
答案 1 :(得分:1)
不确定这是否会有所帮助,但请尝试进一步分解,即。一行用于计算,另一行用于比较:
family_in_poverty(FamilyID) :-
householdSize(FamilyID, Y),
householdIncome(ID, X),
M is 38890 + (Y - 8)*3960,
X =< M,
Y > 8.
答案 2 :(得分:1)
错误应该已经在这里显示:
|: family_in_poverty(FamilyID) :- householdSize(FamilyID, 1), householdIncome(ID, X), X <= 11170.
ERROR: user://1:88:0: Syntax error: Operator expected
如果您不确定Prolog系统支持哪些操作符,或者您自己定义了哪些操作符,则可以通过current_op / 3列出当前定义。以下是SWI Prolog的典型结果:
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 6.1.3)
Copyright (c) 1990-2011 University of Amsterdam, VU Amsterdam
?- setof(Z,current_op(X,Y,Z),L), write(X-Y-L), nl, fail; true.
1-fx-[$]
200-fy-[+,-,@,\]
200-xfx-[**]
200-xfy-[^]
250-yfx-[?]
400-yfx-[*,/,//,<<,>>,div,mod,rdiv,rem,xor]
500-yfx-[+,-,/\,\/]
600-xfy-[:]
700-xfx-[<,=,=..,=:=,=<,==,=@=,=\=,>,>=,@<,@=<,@>,@>=,\=,\==,\=@=,as,is]
900-fy-[\+]
990-xfx-[:=]
1000-xfy-[,]
1050-xfy-[*->,->]
1100-xfy-[;]
1105-xfy-[|]
1150-fx-[discontiguous,dynamic,initialization,meta_predicate,
module_transparent,multifile,public,thread_initialization,thread_local,volatile]
1200-fx-[:-,?-]
1200-xfx-[-->,:-]
如您所见,没有运算符&lt; =已定义。现在是Prolog系统遇到“term atom ...”形式的输入而atom未被定义为中缀或后缀运算符时,它会发出语法错误消息“Operator Expected”或者其他一些。
您可能想要做的是算术比较。算术比较小于或等于由operator =&lt;在Prolog。操作员甚至在ISO核心标准中定义。它的行为使得左手侧和右手侧被算术评估,然后进行算术比较。
还有另一个算子@ =&lt;哪个不评估,哪个不是算术比较而是词法比较。在比较整数和浮点数时的算术比较中,整数首先加宽为浮点数。在词汇比较中,比较类型。因此:
?- 1 =< 1.0.
true
?- 1 @=< 1.0.
false
最好的问候
SWI Prolog算术比较: 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词汇比较: 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
答案 3 :(得分:0)
Prolog中的简单经验法则:不等式符号始终指向等号。示例:=&lt;,&gt; =,@ =&lt;,@&gt; =等等。这与命令式语言不同,后者通常首先出现不等式符号。