Как кодировать формулу логики первого порядка в C? - PullRequest
2 голосов
/ 23 октября 2010

Я новичок в C и новичок в stackoveflow.У меня есть некоторые проблемы при кодировании формулы первого порядка, например

forall([X],implies(X,f(X)))

Здесь x - переменная, подразумевает предикат, а f - функция.Похоже, что для всех x, x подразумевает функцию x i'e f (x).

с использованием C. Любые предложения и помощь будут оценены.

Ответы [ 2 ]

7 голосов
/ 23 октября 2010

Формулы первого порядка имеют логические пропозициональные части (в вашем примере «подразумевает (x, f (x))») и квантификаторы («Forall x»).

Вы уже должны знать, что кодирование вызова функции "f (x)" точно так же кодируется в C.

Вы кодируете пропозициональную часть как логический C-код, используя логические связки. В вашем примере «implication» не является собственным оператором C, поэтому вам придется заменить его немного другим кодом. В с "?" Оператор делает свое дело. «a? b: c» производит «b», если «a» истинно, и «c» в противном случае. Для вашего примера:

   x?f(x):false

Квантификаторы означают, что вам нужно перечислить набор возможных значений квантифицированной переменной, которая всегда имеет некоторый абстрактный тип. В логике этот набор может быть бесконечным, но это компьютеры, это не так. В вашем случае вам нужно перечислить набор значений, которые могут быть «х». Для этого вам нужен способ представления набора; Самый простой способ сделать это в C - использовать массив для хранения членов набора X и перебора массива:

type_of_x set_of_x[1000];
  ... fill x somehow ...
for(i=1;i<number_of_set_elements;i++)
{   x= set_of_x[i];
      ... evaluate formula ...
}

Поскольку «forall» является ложным, если любой пропозициональный экземпляр является ложным, вам нужно выйти из перечисления, когда вы найдете ложный пример:

boolean set_of_x[1000]; // in your example, x must be a boolean variable
// forall x
... fill x somehow ...
final_value=true;
for (i=1;i<number_set_elements; i++)
{  x= set_of_x[i];
   if (x?f(x):false)
      { final_value=false;
         break;
      }
}
... final_value set correctly here...

«существует» - это истина, если любой пропозициональный экземпляр истинен, поэтому вам нужно выйти из перечисления, когда вы найдете верный результат:

// exists x
... fill x somehow ...
final_value=false;
for (i=1;i<number_set_elements; i++)
{  x= set_of_x[i];
   if (x?f(x):false)
      { final_value=true;
         break;
      }
}
... final_value set correctly here...

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

Вы также получите множество «наборов» (несколько массивов, несколько связанных списков, несколько хеш-таблиц), поэтому вам необходимо научиться использовать эти структуры данных. Кроме того, ваши количественные значения могут быть не булевыми, но это нормально; вы все равно можете передать их функциям, которые вычисляют логические значения. Для вычисления FOL для:

 forall p:Person old(p) and forall f:Food ~likes(p,f)

будет использоваться следующий фрагмент кода (подробности предоставлены читателю):

 person array_of_persons[...];
 foods array_of_foods[...]

 for (i=...
 { p=array_of_persons[i];
   is_old = old(p);
   for(j=...
    { f=array_of_foods[j];
      ...
         if (is_old && !likes(p,f)) ...
    }
 }
0 голосов
/ 23 октября 2010

C является обязательным языком программирования. «Императив» здесь означает, что выполнение происходит через программиста, который специально говорит компьютеру, что делать.

Для того, что вы хотите, Пролог больше подходит. Он основан на логике предикатов первого порядка, и его выполнение происходит путем попытки «найти опровержение разрешения отклоненного запроса», который определяется целью пользователя. Этот подход очень отличается от C, поскольку выполнение намного более неявно, а выражение намерения выглядит совсем иначе.

Если у вас много времени, вы можете написать свой собственный решатель ограничений или интерпретатор Пролога на C, но по умолчанию C не имеет первоклассной поддержки того, что вы ищете.

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