2

私はPrologを学び始めています、そして私は私のコードでコンパイラエラーに遭遇しています。私は、家族が特定の条件を満たす場合に家族が貧困状態にあるかどうかをチェックするコードを書き込もうとしています。最後の数行は貧困状態であり、それが私がOpertator Expectedエラーを受け取っているところです。私は、家族IDを考えると、その家族のサイズが1で、収入が11170未満の場合、その家族は貧困状態にあると言いたいのです。また、8を超える規模の家族の場合、貧困レベルは38890に加えて、家族が1人増えるごとに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

4 に答える 4

3

Prolog はis <=、数値の比較には使用せず=<、以下の比較のみに使用します。

キーワードを使用する場合、これは右辺を数値式として評価し、結果を左辺と統合するis中置述語is/2です。

于 2012-04-29T21:09:08.830 に答える
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-[-->,:-]

ご覧のとおり、演算子 <= は定義されていません。現在、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

于 2012-04-29T21:59:28.963 に答える
1

これが役立つかどうかはわかりませんが、もう少し分解してみてください。1 行は計算用、もう 1 行は比較用です。

family_in_poverty(FamilyID) :- 
  householdSize(FamilyID, Y), 
  householdIncome(ID, X), 
  M is 38890 + (Y - 8)*3960,
  X =< M, 
  Y > 8.
于 2012-04-29T21:30:26.450 に答える
0

Prolog の単純な経験則: 不等号は常に等号を指します。例: =<、>=、@=<、@>= など。これは、不等号が通常最初に現れる命令型言語とは異なります。

于 2013-09-24T15:46:25.030 に答える