2013-07-16 4 views
2

Я хочу, чтобы механизм пролога возвращал false вместо ошибки. У меня есть этот код:Игнорировать ошибки типа в прологе и возвращать false вместо

:-use_module(library(clpfd)). 

set_1(X):-member(X,[f(f(1))]). 
p :- X in 1..3,set_1(f(X)). 

Когда я запрашиваю р, я получаю ошибку:

?- p. 
ERROR: Type error: `integer' expected, found `f(1)' 

Я хочу выход выглядеть следующим образом:

?- p. 
false 

я ожидал увидеть false, даже если я меняю член (X, [f (f (1))]) на член (X, [f (f (f (1)))]) или на какой-либо другой набор, не внося никаких других изменений в моя программа.

Я использую SWI-Пролог v 5.10.4

ответ

3

Использование catch/3. Пример:

?- catch(p, error(type_error(_,_),_), false). 
false. 

Это декларативно совершенно нормально, чтобы заменить Типу ошибки молчаливым отказом, как это. Это неверно для ошибок , так как при добавлении большего количества целей может возникнуть ошибка создания экземпляра, но ошибка типа не может.

+0

Спасибо, это помогает. К сожалению, в некоторых случаях поведение возврата false в случае ошибки не является ожидаемым. Рассмотрим set_1 (X): - член (X, [f (f (1)), f (1)]). Ответ должен быть правдой, но он возвращает false, потому что есть ошибка в сопоставлении с первым аргументом. Я закончил реализацию моей собственной функции-члена, которая всегда работает. –

 Смежные вопросы

  • Нет связанных вопросов^_^