У меня очень простая проблема: напишите программу Prolog, которая реализует функцию Prolog add, которая объединяет две строки и работает следующим образом:
- добавить ([a, b], [c, d], X). ---> X = [a, b, c, d]
- добавить ([a, b], X, [a, b, c, d]). ---> X = [c, d]
- добавить ([a, b], [X, d], [a, b, c, d]). ---> X = c
- добавить (X, Y, [a, b, c, d]). ---> X = [] и Y = [a, b, c, d)
Итак, у меня есть два следующих решения, и я не уверен, верна ли моя декларативная интерпретация:
1) РЕШЕНИЕ 1:
myappend1([],L,L).
myappend1([X|L1],L2,[X|L3]) :- myappend1(L1,L2,L3).
Я думаю, что декларативно могу прочесть это следующим образом:
Факт говорит о том, что: если первый список (L1) пуст, а второй список (L2) не пуст, то это ИСТИНА, что конкатенация L1 * L2 равна L2
Если факт, что это неправда, это означает, что первый список не пуст, и поэтому конкатенация первого списка и второго списка неверна, это второй список
Итак, позвольте мне назвать первый список L1, второй список L2 и третий список L3, тогда правило отвечает ИСТИНА, если L3 является конкатенацией L1 и L2, в противном случае - ложью.
Я думаю, что декларативное значение этого правила таково: заголовок правила истинен, если истинно тело правила.
- В заголовке извлеките первый элемент X из списка L1 и из списка L3 (и попытайтесь объединить, если оно соответствует, продолжайте, иначе это означает, что третий список это не конкатенация для первого и второго списка)
- В теле вызовите функцию в первом списке без элемента X, втором списке и списке L3 (которые представляют конкатенацию)
Когда он достигает базового случая, в котором у меня есть продемонстрированный факт myappend1 ([], L, L)., который является правдой, программа выполняет возврат к предыдущему прошлому, и поскольку элемент X первого список, объединенный с элементом X третьего списка, он может сделать это также на этом вычислительном проходе он имеет значение ИСТИНА и вернуться назад, пока не достигнет первого утверждения
Это правильная декларативная интерпретация?
2) ВТОРОЕ РЕШЕНИЕ:
myappend2([],L,L).
myappend2(L1,L2,L3) :- L1=[X|T], % Dimostra questo predicato AND
L3=[X|L4], % Dimostra questo predicato AND
myappend2(T,L2,L4). % Dimostra questa funzione
Как и в предыдущем решении, этот факт просто говорит о том, что: если первый список (L1) пуст, а второй список (L2) не пуст, то это ИСТИНА, что конкатенация L1 * L2 равна L2
Если факт, что это неправда, это означает, что первый список не пуст, и поэтому конкатенация первого списка и второго списка неверна, это второй список
Если факт, что это не так, Пролог вызывает правило, и это правило означает, что: заголовок правила истинен, если тело правила истинно.
В этом случае я могу прочитать это так:
Конкатенация L1 и L2 является L3 ИСТИНА, если верно, что:
- Текущий первый элемент X L1 объединяется с текущим первым элементом списка конкатенации, и myappend2 вызывается в первом подсписке L2 и третьем подсписке, это правда
Это правильно?
для меня так сложно декларативно рассуждать :-(