2016-11-23 51 views
0

我有一套規則;Prolog - 在同一元素上搜索兩個列表

family(Mother,Father,Children)那裏的兒童是一個列表,並person/6,我試圖讓兩個子句,一個確保孩子只能在一個家庭,以及其他,如果他們出生在相同或連續的日期然後他們需要在同一個地方出生。

bad_children(X) :- 
    family(I,_,[J|T]), 
    X = [J|T], 
    person(J,_,_,_,date(E,_,A),place(C,_)), 
    person(T,_,_,_,date(F,_,B),place(D,_)), 
    E==F; E==(F+1); E==(F-1), 
    C\==D, 
    write(X). 

bad_child(X) :- 
    family(A,B,[H|T]), 
    family(C,D,[Z|Q]), 
    A\==C, 
    B\==D, 
    =(member(X,[H|T]), member(X,[Z|Q])), 
    write(X). 

我在每個attemptds高於但既不是工作,我覺得我不是行權,任何人都可以給我什麼建議?

+1

表達式'=(member(X,[H | T]),成員(X,[Z | Q])'的意圖是什麼?在Prolog中,這將試圖統一兩個術語'member (當然總是會成功),'H = Z'('H')和'成員(X,[Z | Q])'和「Z」可以統一)和「T = Q」(「T」和「Q」可以統一)。 – lurker

回答

0

沒有一組數據是很難測試,但...我想你可以寫

bad_children(X) :- 
    family(_, _, X), 
    member(J, X), 
    member(T, X), 
    person(J, _, _, _, date(E, M, Y), place(C, _)), 
    person(T, _, _, _, date(F, M, Y), place(D, _)), 
    (E is F; E is (F+1); E is (F-1)), 
    C \== D, 
    write(X). 

bad_child(X) :- 
    family(A, B, L1), 
    family(C, D, L2), 
    A \== C, 
    B \== D, 
    member(X, L1), 
    member(X, L2), 
    write(X). 

的一個問題是bad_children()返回兩次,每場比賽:拳頭爲JT,第二對於相反的順序的孩子。