2010-07-28 23 views
5

Mam zdefiniować regułę z lub operator, ale zwraca wiele true lub false.Prolog lub (;) Rule Return Multiple Result

isloanaccept(Name,Guarantor,LoanType,LoanAmount,LoanTenure) 
:- customer(Name,bank(_),customertype(_), 
citizen(Ci),age(Age),credit(C), 
income(I),property(_),bankemployee(_)), 
Ci == 'malaysian', 
Age >= 18, 
C > 500, 
    I > (LoanAmount/LoanTenure)/12, 
isguarantor(Guarantor,Name), 
ispersonalloan(LoanType,LoanAmount,LoanTenure); 
ishouseloan(LoanType,LoanAmount,LoanTenure); 
isbusinessloan(LoanType,LoanAmount,LoanTenure); 
iscarloan(LoanType,LoanAmount,LoanTenure). 

W rzeczywistości, muszę sprawdzić, czy rodzaj pożyczki spełnia określone wymaganie pożyczki i połączyć z ogólną zasadą.

Innymi słowy, muszę zdefiniować powyższą regułę w ten sposób.

Ci == 'malaysian', Age >= 18,C > 500, 
I > (LoanAmount/LoanTenure)/12, 
isguarantor(Guarantor,Name) 
    Or with (ispersonalloan(LoanType,LoanAmount,LoanTenure); 
      ishouseloan(LoanType,LoanAmount,LoanTenure); 
      isbusinessloan(LoanType,LoanAmount,LoanTenure); 
      iscarloan(LoanType,LoanAmount,LoanTenur) 

Powinna zwrócić 1 wartość true/false zamiast wielu instrukcji w linii komend.

Każda z reguł lub zwraca 1 wartość logiczną, która nie jest miła po sprawdzeniu reguły w wierszu poleceń. Potrzebuję tego (General Rule & (Multiple Or Rule)).

Jak połączyć kilka lub regułę, które zwracają 1 wartość logiczną?

Proszę o pomoc.

Dzięki.

Odpowiedz

3

Po prostu otaczaj wszystkie swoje cele "or" z pomocą once.

np.

once(
ispersonalloan(LoanType,LoanAmount,LoanTenure); 
ishouseloan(LoanType,LoanAmount,LoanTenure); 
isbusinessloan(LoanType,LoanAmount,LoanTenure); 
iscarloan(LoanType,LoanAmount,LoanTenure) 
). 

Teraz cele "or" są udane lub nieudane.

+1

Dzięki. Problem rozwiązany. – peterwkc

0

Przede wszystkim należy umieścić ( i ) wokół celu w połączeniu z ;. Ponieważ obecnie interpretuje to jako rozłączenie customer(...),...,isguarantor(Guarantor,Name), ispersonalloan(...), ishouseloan(...), ..., iscarloan(...). Dzieje się tak, ponieważ różne priorytety operatorów: , i ;.

Faktycznie ; - oznacza rzeczywiste "lub", a nie "wzajemne wyłączne lub", a nie "w innym przypadku". Więc jeśli "ishouseloan" może "odnieść sukces wraz z" ispersonalloan ", to będziesz miał kilka udanych celów. W tym przykładzie once/1 może pomóc (jak dobrze not(not(...))), ale można postarać się prolog głębiej z zadania i określić cele non-everlapping jak (mam pewne osobiste założenia dotyczące nakładających isXXX):

isloan(LT, Am, T):- 
    (ishouseloan(LT,Am,T) 
    ;iscarloan(LT,AM,T) 
    ;not((ishouseloan(LT,Am,T);iscarloan(LT,AM,T))), 
    (ispersonalloan(LT,Am,T) 
    ;isbusinessloan(LT,Am,T) 
    ) 
) 

w tym W takim przypadku powinieneś być w stanie wygenerować wszystkie kredyty, gdy twoje LT, Am i nie są jeszcze powiązane z określonymi wartościami i te isXXX mogą wiązać wolne zmienne.