Пролог Или (;) Правило Возвращает множественный результат - PullRequest
5 голосов
/ 28 июля 2010

Я определил правило с помощью оператора или, но он возвращает несколько значений true или false.

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

На самом деле мне нужно проверить, соответствует ли тип кредита конкретному требованию по кредиту, и объединить с общим правилом.

Другими словами, мне нужно определить вышеприведенное правило следующим образом.

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)

В командной строке должно возвращаться 1 истина / ложь, а не несколько операторов.

Каждое из или правило возвращает 1 логическое значение, которое я не хочу после того, как проверил правило в командной строке. Мне нужно, чтобы это было так (общее правило & (множественное или правило)).

Как объединить несколько или правило, которое возвращает 1 логическое значение?

Пожалуйста, помогите.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 28 июля 2010

Просто окружите все свои цели "or'ed" once.

, например

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

Теперь цели "or'ed" либо успешны, либо провалены.

0 голосов
/ 05 августа 2010

Прежде всего вы должны поместить ( и ) вокруг вашей цели в сочетании с ;.Потому что в настоящее время он интерпретирует это как дизъюнкцию customer(...),...,isguarantor(Guarantor,Name), ispersonalloan(...), ishouseloan(...), ..., iscarloan(...).Это потому, что разные приоритеты операторов , и ;.

На самом деле ; - означают "реальное" или ", а не" взаимоисключающие или "и не" в другом случае ".Так что, если «ishouseloan» может «преуспеть вместе с« ispersonalloan », то у вас будет несколько успешных целей.В этом примере once/1 может помочь (также not(not(...))), но вы можете попытаться углубить пролог в своей задаче и указать нерегламентируемые цели, например (я делаю некоторые личные предположения о перекрытии 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)
    )
  )

В этом случае вы сможете генерировать все ссуды, когда ваши LT, Am и T еще не привязаны к конкретным значениям и эти isXXX могут связывать свободные переменные.

...