2016-11-23 28 views
0

我有一組規則;Prolog - 使用數學運算符的問題

家庭(母親,父親,孩子),兒童是一個列表(例如[ag,bg])和人/ 6。日期以人,日,月,年表示。

我想說的是,如果兩個孩子不是在同一天或連續的日子出生,必須相隔一年。 我一直在這個小時,似乎無法得到任何地方,下面是我的代碼,我個人不明白爲什麼它不會工作。 任何意見將不勝感激。

bad_children() :- 
     family(_,_,Q), 
     member(J,Q), 
     member(T,Q), 
     person(J,_,_,_,date(E,M,Y),place(_,_)), 
     person(T,_,_,_,date(F,M,K),place(_,_)), 
     (E \= F ; E \= (F+1) ; E \= (F-1)), 
     (Y-K) < 1 
    ; (K-Y) < 1, 
     write(J), 
     write(' and '), 
     write(T), 
     write(' are born to close together.'). 

回答

1

主要的錯誤是關於運算符(\ =)/ 2。它的意思是don't unify,它不執行算術評估。

此外,你應該括號(Y-K) < 1 ; (K-Y) < 1

因此,(未經測試)代碼可能是

bad_children :- 
family(_,_,Q), 
member(person(J,_,_,_,date(E,M,Y),_),Q), % You're not interested in place/2 
member(person(T,_,_,_,date(F,M,K),_),Q), 
J \= T, % Regardless the date, you should check the identity. Here \= is fine 
(E =\= F; E =\= F+1; E =\= F-1), 
(Y-K < 1 ; K-Y < 1), 
format('~w and ~w are born to close together.', [J, T]). 
+0

謝謝你的幫助,正確的輸出打印,但在打印答案3次,你有什麼想法,爲什麼會發生這種情況? –

+0

很可能是因爲有多個匹配項。也許你可以將我發佈的有關身份的條件更改爲「J @ CapelliC

+0

我忘了在J和T之間使用\ =,我意識到我應該在看到跟蹤結果後使用它。我很抱歉地問,但我已經看到了幾個月應該會出現,以及它們正在看到,如果他們不到一年的時間,所以只是評估一年沒有用。你會對如何解決這個問題有任何建議嗎? –