Prolog - 获取语法错误 - 预期的操作员

时间:2012-04-29 20:17:23

标签: prolog

我开始学习Prolog,而且我的代码遇到编译错误。我正在尝试编写一些代码,以检查一个家庭是否满足某些条件是否处于贫困状态。最后几行是贫困状况,这就是我得到Opertator Expected错误的地方。我想说的是,考虑到家庭身份证,如果这个家庭的规模是一个,收入低于11170,那么这个家庭就处于贫困状态。对于一个大小> 8的家庭,每增加一个家庭成员,贫困水平为38890加3960。我该如何纠正这些错误? family_in_poverty应该返回truefalse

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.

4 个答案:

答案 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; =等等。这与命令式语言不同,后者通常首先出现不等式符号。