Пролог: Изучение примером

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

int main(int argc, char* argv[])
{
  const int NUMELEMENTS=20;

  char *pBuffer = new char[NUMELEMENTS*sizeof(A)];
  A *pA = (A*)pBuffer;

  for(int i = 0; i < NUMELEMENTS; ++i)
  {
    pA[i] = new (pA + i) A();
  }

  printf("Buffer address: %x, Array address: %x\n", pBuffer, pA);

  // dont forget to destroy!
  for(int i = 0; i < NUMELEMENTS; ++i)
  {
    pA[i].~A();
  }    

  delete[] pBuffer;

  return 0;
}

Независимо от метода Вы используете, удостоверьтесь, что Вы вручную уничтожаете каждый из тех объектов в массиве перед удалением pBuffer поскольку Вы могли закончить с утечками;)

Примечание : Я не скомпилировал это, но я думаю, что это должно работать (я нахожусь на машине, которой не установили компилятор C++). Это все еще указывает на точку:) Надеюсь, что это помогает в некотором роде!

<час>

Редактирование:

причина, которую это должно отслеживать число элементов, состоит в том так, чтобы это могло выполнить итерации через них, когда Вы звоните, удаляют на массиве и удостоверяются, что деструкторы называют на каждом из объектов. Если бы это не знает, сколько существует это, не был бы в состоянии сделать это.

7
задан false 14 June 2014 в 10:25
поделиться

2 ответа

Пролог - это другой способ мышления о программах: вы должны мыслить логически.

Прежде всего A: - B, C, D означает A истинно (успешно), если B, C и D истинны .

Фрагмент кода, который вы опубликовали, проверяет правильность головоломки судоку, есть три условия:

  • элементы все разные по строкам
  • элементы все разные по столбцам
  • элементы все разные по 3x3 блока

Как это работает?

судоку (строки) верно, если:

  1. длина (строки, 9) -> в строках 9 элементов
  2. maplist (_length (9), Rows) -> maplist проверяет предикат (первый параметр) для каждого элемента списка (второй параметр). Это означает, что каждая строка должна иметь длину 9.
  3. maplist (all_distinct, Rows) -> то же, что и раньше, но мы проверяем, есть ли в каждой строке отдельные (не равные попарно) элементы.
  4. transpose (Rows, Columns), maplist (all_distinct, Columns) -> мы транспонируем строки в столбцы, чтобы проверить, не все различны, также выбрав их по вертикали
  5. Rows = [A, B, C, D, E, F, G, H, I] -> разбивает список строк и помещает каждую в разные переменные A, B, C, D ... так что A будет первой строкой, B второй и так далее
  6. блоки (A, B, C), блоки (D, E, F), блоки (G, H , I) -> этот предикат должен быть истинным для троек строк.

Давайте поговорим о части блоков , которую довольно забавно понять. Мы хотим проверить, что каждый блок 3x3 содержит разные значения. Как мы можем это сделать?

Предположим, у нас 3 строки, условие должно выполняться для первых трех элементов каждой строки (первый блок 3x3), для элементов с 4-го по 6-й (второй блок) и с 7-го по 9-й (третий блок).

Итак, мы можем мыслить рекурсивно: блоков ( [], [], []) тривиально верно, у нас есть пустые списки.

case блокирует ([A, B, C | Bs1], [D, E, F | Bs2], [G, H, I | Bs3]) выбирается, когда вы вызываете предикат блоков с параметрами, которые являются списком с ТОЛЬКО 3 элементами. Таким образом, мы можем проверить, все ли A, B, C, D, E, F, G, H, I различны, затем мы вызываем блоки рекурсивно, используя в качестве параметров списки остатков (без первых трех элементов) . Это то, о чем идет речь в Prolog!

Итак, блоки будут вызываться первыми с тремя строками по 9 элементов, он проверит, что первые 3 каждой строки отличны, и вызовет себя с 3 списками из 6 элементов,

11
ответ дан 6 December 2019 в 12:52
поделиться

sudoku / 1 в основном описывает ограничения, которым должно удовлетворять решение судоку, где доска представлена ​​в виде списка из девяти списков длины девять. Проблема / 2 присваивает частично созданной плате номер проблемы. Чтобы использовать его, вы должны выполнить

? - problem (1, Board), sudoku (Board).

Вы должны прочитать предикаты, используемые в документации .

3
ответ дан 6 December 2019 в 12:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: