2017-02-02 13 views
1

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

Я видел некоторые популярные уроки (возможно, я не искал достаточно точно), но я не могу найти учебник, в котором рассказывается, как планировать алгоритм, используя ДЕЙСТВИТЕЛЬНО элементарные шаги.

Например ...

Задача:

Написать 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. Есть ли способ, чтобы найти ответ самостоятельно? Под этим я подразумеваю - не ответ на проблему, а алгоритм, который я показал, чтобы решить эту проблему. Иными словами, алгоритм моего алгоритма.

  2. Если вы можете ответить на вопрос 1, как я могу найти этот тип подсказок в будущем? Есть ли конкретное имя для моей проблемы?

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

ответ

2

Списки не определены как значения элементов в них. списки определяются рекурсивно, как пустые, или пара элемента, а остальные элементы:

list([]). 
list([_A|B]) :- list(B). 

Списки могут быть одинаковыми:

same_lists([], []). 
same_lists([A|B], [A|C]) :- same_lists(B, C). 

Или один может быть короче другой, т.е. его префикс:

list_prefix([], L):- list(L). 
list_prefix([A|B], [A|C]):- list_prefix(B, C). 

Где заканчивается префикс, суффикс начинается:

list_split([], L, L):- list(L). 
list_split([A|B], Sfx, [A|C]):- list_split(B, Sfx, C). 

Итак, общий совет: следуйте за типами, как они построены и проанализируйте ситуацию в соответствии со всеми возможными случаями. Со списками это пустые или непустые списки.

+0

Это то, что я искал в своем вопросе 1 и вопросе 2. Большое вам спасибо. Это делает мое исследование намного проще! Спасибо также за понимание моего способа спросить и понять, как ответить. –

+0

рад помочь. если это вам помогло, вы также можете «принять» ответ, нажав галочку рядом с ним. :) –