Лучший способ определить предикат в Прологе

У меня проблема с определением процедур в Прологе. У меня есть два исходных файла, и я хочу проконсультироваться с движком Prolog с обоими. Это можно сделать, вызвав Prolog как swipl -g «['1.pl', '2.pl'].

Оба файла созданы другой программой, написанной на другом языке программирования, и я не могу заранее предсказать точное содержание файлов.

Проблема в том, что в одном из файлов всегда есть правило

predicate1(X):-predicate2(X).

Но иногда правило

predicate2(something):-body

не существует в обоих файлах, и я получаю сообщение об ошибке «predicate2 is undefined» при выполнении некоторых запросов для predicate1.

Если я включу строку

:- dynamic(predicate2/2). 

в один из файлов это помогает, только если предикат / 2 не определен в другом файле (иначе я получаю что-то вроде «вы действительно уверены, что хотите переопределить предикат2 / 2?». И здесь я не хочу что-то переопределять чтобы сохранить данные из другого файла.

Итак, я понятия не имею, как сделать предикат просто «определенным». Мне нужно решение для SWI-Prolog или SICStus Prolog. (к сожалению, в версиях нет раздела для определения предикатов, вроде визуального Пролога)


person Evgenii.Balai    schedule 31.12.2011    source источник
comment
Возможный способ - включить что-то вроде predicate2 (blablabla ..). в обоих файлах, но мне это не нравится, потому что иногда бывают запросы типа predicate2 (X), а набор для X включает blablabla ..   -  person Evgenii.Balai    schedule 31.12.2011
comment
есть ли для этого специальная команда? Ничего полезного в документации не нашел   -  person Evgenii.Balai    schedule 31.12.2011


Ответы (3)


В SWI Prolog вы можете избежать ошибки. Измените поведение системы с помощью встроенного ISO

:- set_prolog_flag(unknown, Choice).

Выбор может быть одним из (сбой, предупреждение, ошибка).

Итак, ваша командная строка будет такой:

swipl -g “set_prolog_flag(unknown,fail),['1.pl','2.pl']."

Другая возможность: определить поддельную процедуру

swipl -g “assert(predicate2(_):-fail),['1.pl','2.pl']."

HTH

person CapelliC    schedule 31.12.2011

Вам необходимо объявить predicate2/2 multifile с помощью одноименной директивы ISO. Итак, в каждом из файлов вы пишете вверху или перед любыми пунктами predicate2/2:

:- multifile(predicate2/2).

Это независимо от того, есть ли у вас предложения для этого предиката.


Предложение @CapelliC - определенно опасный ход. Если вы отключите все ошибки существования, вы пропустите много допустимых ошибок!

Например, вы объявили dynamic(predicate2/2), но использовали predicate2(_). Итак, какую арность вы хотите?

person false    schedule 15.04.2014

Ясно, что Пролог не может ответить ни на один вопрос, который мы формулируем. Например, если мы спросим, ​​утка ли Дональд

?- isDuck(Donald) .
! ----------------------------------------
! Error 20 : Predicate Not Defined
! Goal : isDuck(_17610)

Prolog ответит, что ничего не знает о том, является ли «что-то» уткой или нет. Происходит то, что логический предикат isDuck/1 не определен (предикат не определен), поэтому Prolog не может проверить, является ли «что-то» уткой или нет. Как мы увидим позже, даже если Пролог не знает, что такое утка, его можно научить различать, что такое утка, а что нет. Как мы уже говорили ранее, Пролог - это язык диалога. В диалоге между системой и программистом Prolog не только может ответить на определенные вопросы, но также может узнать о том, чего он не знает. Чтобы ответить на вопросы, сформулированные программистом, Prolog проверяет базу знаний, в которой зарегистрировано все, что известно Prolog. В начале сеанса Пролога в базе знаний хранятся базовые знания, которые включают, помимо прочего, концепции и определения арифметики натуральных чисел. Во время сеанса можно расширить эту базу знаний, включая определения и концепции, с которыми Prolog не знаком (например, определение утки), или также изменить и расширить определения, которые знает Prolog (например, включая новые арифметические операторы). для натуральных чисел). Факты и правила выражают базу знаний. Факты и правила являются синтаксическими представлениями Horn Clauses первого порядка. Таким образом, все знания Пролога выражаются с использованием (почти) исключительно логики первого порядка. По этой причине Пролог считается языком логики. Программа на Прологе - это набор фактов и правил, выражающих определенные знания.


person TheOraclePhD    schedule 15.04.2014
comment
Это не отвечает на вопрос, в котором говорится, что предикат определен, но в другом файле. - person Soren Bjornstad; 17.11.2016