Дерево разрешения SLD, который предикат применяется, чтобы дать первый повторный растворитель - PullRequest
0 голосов
/ 20 мая 2018

Я думал, что смогу решить деревья SLD, пока не нашел этот вопрос в предыдущих статьях.

Какой предикат будет выбран впервые?

Я предполагаю, что это третье правило,но может ли кто-нибудь объяснить мне, как подойти к этому вопросу, просто показывая процедуру решения swap([1,2], U)

Как мы объединяем ([S,H|U]) с U?

РЕДАКТИРОВАТЬ Предполагая, что я пытался объединить:

swap([H,S|T], [S,H|U]) с swap([1,2], U)

[H,S|T] = [1,2], [S,H|U] = U
H = 1, S = 2, T = [], [S,H|U] = U
H = 1, S = 2, T = [], [2,1|U] = U
H = 1, S = 2, T = [], U = [2,1|U]

и я заканчиваюс swap([], U']), но как это объединить с 3 данными фактами / правилами, чтобы привести к U = [2,1]

Logic Program Question

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

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

solving:  swap([1,2], U).
selecting: 
          -> swap([], []).   
             <- doesn't match
          -> swap([H0], [H0]).
             <- doesn't match
          -> swap([H1,S1|T1], [S1,H1|U1]) :- swap( T1, U1).
             = matches, with
               { [H1,S1|T1] = [1,2]
               , [S1,H1|U1] = U }
               i.e.
               { H1 = 1, S1 = 2, T1 = [], U = [2,1|U1] }
             -> now solve the body
                swap( T1, U1)
                i.e.
                swap( [], U1) 
                ->
          ........

Чтобы завершить пример, вы должны решить swap( [], U1) той же процедурой, что и в этом ответе, выбрав каждое из трех предложений предиката swap/2:

  1. swap([], []). (соответствует swap( [], U1)?)
    • Да, соответствует, объединяя U1 = [].затем это используется в объединении для U, то есть
      U = [S1,H1|U1] = [2,1|U1] = [2,1|[]] = [2,1].
  2. swap([H2],[H2]). (соответствует swap( [], U1)?)
  3. и т.п.

Если, конечно, вы можете переименовать переменные как угодно, например, swap([A99],[A99])., при условии, что переименование непротиворечиво (т. Е. Переименуйте переменную только один раз и используйте новое имя вместо старого)., последовательно).

0 голосов
/ 20 мая 2018

([S,H|U]) и U не должны совместно использовать переменную U. Перед применением правила вы должны «освежить» его переменные, например, путем добавления подчеркивания или простого числа.Затем вы объедините ([S',H'|U']) и U.

...