2010-07-28 14 views
5

Tengo que definir una regla con o operador pero devuelve múltiples verdaderos o falsos.Prólogo O (;) Regla Devolver Resultado Múltiple

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). 

En realidad, yo necesita comprobar si el tipo de préstamo es cumplir el requisito de préstamo en particular y se combinan con regla general.

En otras palabras, necesito definir la regla anterior de esta manera.

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) 

Debe devolver 1 verdadero/falso en lugar de instrucción múltiple en la línea de comandos.

Cada uno de los valores booleanos devueltos por la regla 1 que no es lo que deseo después de haber verificado la regla en la línea de comandos. Necesito tener esto (regla general & (múltiple o regla)).

¿Cómo combinar varios o reglas que devuelven 1 valor booleano?

Por favor ayuda.

Gracias.

Respuesta

3

Simplemente rodee todos sus objetivos "marcados" con once.

p. Ej.

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

Ahora, los objetivos "marcados" tienen éxito o fallan.

+1

Gracias. Problema resuelto. – peterwkc

0

En primer lugar debe poner ( y ) alrededor de su objetivo combinado con ;. Porque actualmente lo interpreta como disjunction de customer(...),...,isguarantor(Guarantor,Name), ispersonalloan(...), ishouseloan(...), ..., iscarloan(...). Eso se debe a las diferentes prioridades de los operadores , y ;.

En realidad ; - significa real "o", no "mutuamente exclusivo o" y no "en otro caso". Entonces, si "ishouseloan" puede "tener éxito junto con" ispersonalloan ", tendrás varios objetivos exitosos. En este ejemplo once/1 puede ayudar (así not(not(...))), pero se puede tratar de conseguir prólogo más profunda con su tarea y especificar objetivos no everlapping como (hago algunas suposiciones personales sobre la superposición 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) 
    ) 
) 

en este En caso de que sea capaz de generar todos los préstamos cuando su LT, Am y T aún no está vinculado a valores específicos y esos isXXX pueden vincular variables libres.