2012-04-29 18 views
3

私はPrologを学び始めています。私は自分のコードでコンパイラエラーに遭遇しています。私はある条件を満たす家族が貧困にあるかどうかをチェックするコードを書くようにしています。最後の2行の行は貧困状態です。それがOpertator Expectedというエラーを出しています。私は家族のIDが与えられ、その家族のサイズが1で、収入が11170未満であれば、その家族は貧困状態にあると言っています。また、> 8の規模の家族の場合、追加の家族ごとに貧困レベルは38890プラス3960です。これらのエラーを修正するにはどうすればよいですか? family_in_povertytrueまたはfalseを返します。Prolog - 構文エラーを取得する - 演算子が必要です

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. 

答えて

3

Prologはちょうど=<より-レスまたは-等しいため、数値の比較のためにis <=を使用していません。

あなたがisキーワードを使用する場合、これは中置述語では、数値表現として右辺を評価し、左側で結果を単一化すること/ 2です。

+0

私は 'is'を取り除いても、以前と同じ行に同じエラーメッセージが表示されています – user906153

1

これが役立つかどうかはわかりませんが、もう少し細かく分解してみてください。計算のための1つの行、別の比較のために:

family_in_poverty(FamilyID) :- 
    householdSize(FamilyID, Y), 
    householdIncome(ID, X), 
    M is 38890 + (Y - 8)*3960, 
    X =< M, 
    Y > 8. 
+0

いいえ、まだエラーメッセージが表示されています。 – user906153

+0

それでは、上のどの行に問題がありますか? – magus

+0

'X <= M'ライン – user906153

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-[<,=,=..,=:=,=<,==,[email protected]=,=\=,>,>=,@<,@=<,@>,@>=,\=,\==,\[email protected]=,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-[-->,:-] 

あなたは何のオペレータ< =定義されたがありません見ることができるように。 Prologシステムでは、 "term atom ..."という形式の入力に遭遇し、atomが中置演算子または後置演算子として定義されていない場合、 "Operator Expected"などの構文エラーメッセージが発行されます。

あなたがしたいことは、算術比較です。それ以下の算術比較は、Prologの演算子= <によって示されます。オペレータはISOコア標準でも定義されています。左辺と右辺が算術的に評価され、次に算術的に比較されるように動作します。

演算子@ = <は評価されず、算術比較ではなく語彙比較があります。算術比較で、整数と浮動小数点数を比較すると、浮動小数点数は浮動小数点数に拡大されます。字句比較では、型が比較されます。したがって:

?- 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

+0

'@ = <'のISO用語の順序では、すべての浮動小数点は整数よりも小さくなります。つまり、「3.0 @ = <1」です。 IF、YAP、B、GNU、SICStus、XSB、Ciaoのように成功します。悲しいかな、** SWIでは**ありません。 – false

+0

SWIは問題ありません:? - compare(X、3.0,1)。 X =(>)。 ? - set_prolog_flag(iso、true) ? - compare(X、3.0,1)。 X =(<)。ドキュメンテーション:Prologフラグisoが定義されている場合、すべての浮動小数点数がすべての整数に先行します。 –

+0

最初からすぐそこにいなければなりません。標準の非標準的な振る舞いについては、標準には規定がありません。 – false

0

シンプルな経験則プロローグで:常に不平等のシンボル等号シンボルを指します。例:= <、> =、@ = <、@> =などです。これは、不等式記号が通常最初に現れる命令的言語とは異なります。

+4

私はルールの親指は 'のような矢のような形を避けるべきだと思います。なぜなら、矢印は論理的な性質を表現するのに役立つからです。 – CapelliC

関連する問題