swi - unificacion prolog
Prolog O(;) Regla Devuelve Resultado MĂșltiple (2)
En primer lugar, debe poner (
y )
alrededor de su objetivo combinado con ;
. Porque actualmente lo interpreta como disyunción 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 (y not(not(...))
), pero puede tratar de obtener un prólogo más profundo con su tarea y especificar objetivos no permanentes como (hago algunas suposiciones personales sobre la superposición de 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 caso, debería poder generar todos los préstamos cuando su LT
, Am
y T
todavía no están vinculados a valores específicos y aquellos isXXX
pueden vincular variables libres.
he definido una regla con o operador pero devuelve múltiples verdaderos o falsos.
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, necesito verificar si el tipo de préstamo cumple con el requisito particular del préstamo y lo combino con una 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)
Debería devolver 1 verdadero / falso en lugar de instrucción múltiple en la línea de comando.
Cada uno de los valores booleanos devueltos por la regla 1 que no quiero 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.
Simplemente rodee todos sus objetivos "orientados" con once
.
p.ej
once(
ispersonalloan(LoanType,LoanAmount,LoanTenure);
ishouseloan(LoanType,LoanAmount,LoanTenure);
isbusinessloan(LoanType,LoanAmount,LoanTenure);
iscarloan(LoanType,LoanAmount,LoanTenure)
).
Ahora, los objetivos "ordenados" tienen éxito o fracasan.