Мне нужно создать некоторый «список предикатов» в прологе. Но я не совсем понимаю способ мышления , который я должен узнать, хочу ли я создать некоторые рабочие предикаты.алгоритм извлечения для построения правил пролога
Я видел некоторые популярные уроки (возможно, я не искал достаточно точно), но я не могу найти учебник, в котором рассказывается, как планировать алгоритм, используя ДЕЙСТВИТЕЛЬНО элементарные шаги.
Например ...
Задача:
Написать
concat(X,Y,Z).
предикат, который берет элементы из списковX
иY
и сцепляет их в спискеZ
.
Мой анализирующая алгоритм:
Во-первых, я определяю область числа элементов я буду конкатенации (длины списков
X
иY
) как неотрицательные целые числа (XCount> = 0 и YCount> = 0). Затем я создаю предикат для первого случая, который XCount = 0 и YCount = 0:
concat([],[],[]).
... затем проверить его и найти, что он работает в первом случае.
Затем я создаю предикат для второго случая, когда XCount = 1 и YCount = 0, так как:
concat(X,[],X).
... и снова проверить его и найти, что он работает с некоторым неожиданным положительным результатом.
Результаты:
я могу видеть, что этот алгоритм работает не только для XCount = 1, но и для XCount = 0. Таким образом, я могу удалить
concat([],[],[]).
и толькоconcat(X,[],X).
, потому чтоX = []
внутри предикатаconcat(X,[],X).
это то же самое, что иconcat([],[],[]).
.Второй неожиданный результат в том, что алгоритм работает не только для XCount в 0,1, но для всех XCount> = 0.
Затем я анализирую домен и поиск элементов, которые еще не были обработаны, и найти, что самый простой способ - создать второй предикат для YCount> 0.
Вспоминая, что использование только X в качестве первого аргумента может охватывать все XCount> = 0, я создаю случай для YCount = 1 и всех Xes, который составляет:
concat(X,[Y|_],[Y|X]).
И это место, где мой алгоритм получает переполнение мозгового буфера.
Уважайте правила stackoverflow, я точно спрашиваю.
Вопросы:
Есть ли способ, чтобы найти ответ самостоятельно? Под этим я подразумеваю - не ответ на проблему, а алгоритм, который я показал, чтобы решить эту проблему. Иными словами, алгоритм моего алгоритма.
Если вы можете ответить на вопрос 1, как я могу найти этот тип подсказок в будущем? Есть ли конкретное имя для моей проблемы?
Насколько я должен быть - сколько случаев и на каком языке я могу попытаться реализовать свой алгоритм, который не просто «делает» вещи, а «задумывается» о том, как планировать и создавать другие алгоритмы.
Это то, что я искал в своем вопросе 1 и вопросе 2. Большое вам спасибо. Это делает мое исследование намного проще! Спасибо также за понимание моего способа спросить и понять, как ответить. –
рад помочь. если это вам помогло, вы также можете «принять» ответ, нажав галочку рядом с ним. :) –