2010-07-28 17 views
5

J'ai défini une règle avec ou opérateur mais elle renvoie plusieurs valeurs vrai ou faux.Prolog Or (;) Règle Résultat multiple Résultat

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 fait, je dois vérifier si le type de prêt est satisfaire à l'exigence de prêt particulier et de combiner à la règle générale. En d'autres termes, j'ai besoin de définir la règle ci-dessus comme ceci.

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) 

Il doit retourner 1 vrai/faux plutôt que plusieurs instructions dans la ligne de commande.

Chacune de la valeur booléenne return 1 return dont je ne veux pas après avoir vérifié la règle dans la ligne de commande. J'ai besoin d'avoir comme ceci (Règle générale & (Multiple ou Règle)).

Comment combiner plusieurs ou règle qui retourne 1 valeur booléenne?

Aidez-nous s'il vous plaît.

Merci.

Répondre

3

Entourez simplement tous vos objectifs "ou" avec once.

par exemple.

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

Maintenant, les objectifs "or" se succèdent ou échouent.

+1

Merci. Problème résolu. – peterwkc

0

Tout d'abord vous devriez mettre ( et ) autour de votre cible combinée avec ;. Parce qu'actuellement il l'interprète comme disjonction de customer(...),...,isguarantor(Guarantor,Name), ispersonalloan(...), ishouseloan(...), ..., iscarloan(...). C'est parce que les différentes priorités des opérateurs , et ;.

En fait ; - signifie réel "ou", non "exclusif mutuel ou" et non "dans les autres cas". Donc, si "ishouseloan" peut réussir avec "ispersonalloan", vous aurez plusieurs cibles réussies. Dans cet exemple once/1 peut aider (ainsi not(not(...))), mais vous pouvez essayer d'obtenir Prolog plus profond avec votre tâche et spécifier des cibles non everlapping comme (je fais quelques hypothèses personnelles au sujet de chevauchement 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) 
    ) 
) 

Dans ce cas, vous devriez être en mesure de générer tous les prêts lorsque votre LT, Am et T n'est pas encore lié à des valeurs spécifiques et ceux isXXX peuvent lier des variables libres.