2012-04-29 70 views
3

我開始學習Prolog,並且我的代碼遇到編譯器錯誤。我試圖編寫一些代碼來檢查一個家庭是否處於貧困狀態,如果他們符合某些條件。最後一行的幾行是貧窮條件,這就是我得到Opertator Expected錯誤的地方。我試圖說,鑑於家庭身份證,如果這個家庭的規模是一個,而收入低於11170,那麼這個家庭就處於貧困狀態。而對於規模大於8歲的家庭來說,每增加一個家庭成員,貧困程度爲38890加上3960。我怎樣才能糾正這些錯誤? family_in_poverty應返回truefalseProlog - 獲取語法錯誤 - 運算符期望

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

不知道這是否會有所幫助,但嘗試把它分解得更深一點即可。一條線的計算,另一個用於比較:

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很好:? - 比較(X,3.0,1)。 X =(>)。 ? - set_prolog_flag(iso,true)。 爲真。 ? - 比較(X,3.0,1)。 X =(<)。文檔說:如果定義了Prolog標誌iso,所有浮點數都在所有整數之前。 –

+0

它必須從一開始就在那裏。標準中沒有關於默認非標準行爲的規定。 – false

0

簡單規則的拇指在序言:總是不平等符號指向等號。例如:= <,> =,@ = <,@> =等。這與命令式語言不同,在命令式語言中不等式符號通常首先出現。

+4

我認爲經驗法則應該是'避免像形狀一樣的箭頭'。這是因爲箭頭對錶達邏輯屬性很有用。 – CapelliC

相關問題