Унификация структуры функций в миниканрене

Как определить унификация и включение в состав структуры признаков в миниканрене, если мы представляем структуры признаков со списками ?

Общее поведение будет примерно таким (я думаю):

(run* (q) (unifyo '(a b) '(a b) q))) => (a b)

(run* (q) (unifyo '(x (a b)) '(x (c d)) q)) => (x (a b) (c d)) (x (c d) (a b))

(run* (q) (unifyo '(x (a b)) '(x (a d)) q)) => ()      ; fails because '(a b) is 
                                                       ; incompatible with '(a d)
(run* (q) 
    (fresh (y) (unifyo '(x (a b)) `(x ,y) q)) => (x (a b)))

(run* (q) (unifyo q '(x (a b)) '(x (a b) (c d)))) => (x (c d))

Следующий код работает, но обратная унификация зависает при запуске с run*:

;; unifies f1 with l2
(define unify-f-with-list°
  (lambda (f1 l2 out)
    (conde
     [(== '() l2) (== `(,f1) out)]
     [(fresh (la ld a2 d2 a1 d1 res)
         (=/= '() l2)
         (== `(,la . ,ld) l2)
         (== `(,a2 . ,d2) la)
         (== `(,a1 . ,d1) f1)
         (conde
          [(== a2 a1)
           (== `(,res . ,ld) out)
           (unify° f1 la res)]
          [(fresh ()
              (=/= a2 a1) ;; if not
              (== `(,la . ,res) out)
              (unify-f-with-list° f1 ld res))]))])))

(define unify-list-with-list°
  (lambda (l1 l2 out)
    (conde
     [(== '() l1) (== l2 out)]
     [(== '() l2) (== l1 out)]
     [(fresh (a1 d1 res)
         (=/= '() l1)
         (== `(,a1 . ,d1) l1)
         (unify-f-with-list° a1 l2 res)
         (unify-list-with-list° d1 res out))])))

(define unify°
  (lambda (f1 f2 out)
    (conde
     [(== f1 f2) (== f1 out)]
     [(fresh (a1 d1 a2 d2)
         (=/= f1 f2)        
         (== `(,a1 . ,d1) f1)
         (== `(,a2 . ,d2) f2)
         (== a1 a2)
         (fresh (res)
            (unify-list-with-list° d1 d2 res)
            (== `(,a1 . ,res) out)))])))

person Matías Guzmán Naranjo    schedule 22.11.2018    source источник
comment
что такое фтс? 123456   -  person rain1    schedule 23.11.2018
comment
структуру функций, я изменил ее.   -  person Matías Guzmán Naranjo    schedule 23.11.2018
comment
Не могли бы вы уточнить, что означают три входа, точнее? В частности, неясно, какой должна быть форма третьего аргумента. А также, что такое переменные и что такое атомы? Почему (a b) совместимо с (c d) во 2-м примере, а (a b) несовместимо с (a d) в 3-м примере?   -  person Alex Knauth    schedule 25.11.2018
comment
Не могли бы вы объяснить контекст и значение каждого примера вызова? Включить несколько ссылок, чтобы определить все термины, которые вы используете? Хотя бы какая-то ссылка на какую-то соответствующую страницу или что-то в этом роде?   -  person Will Ness    schedule 25.11.2018
comment
Я говорю о структурах функций, таких как эти, и хотел бы иметь функциональность, подобную прологу, например здесь   -  person Matías Guzmán Naranjo    schedule 25.11.2018
comment
Три входных данных будут следующими: (функция-структура-1 функция-структура-2 результат унификации). Структура признаков представляет собой пару атрибут-значение. (a b) не может унифицироваться с (a c), потому что для одного и того же атрибута они имеют разные значения. (x (a b)) может объединиться с (x (c d)) потому что 'c и 'a различны. Страница пролога объясняет это хорошо. Если у нас есть [agr [число sg]] и объединить его с [agr [человек 3]], мы должны получить [agr [число sg | лицо 3]].   -  person Matías Guzmán Naranjo    schedule 25.11.2018
comment
для возможной реализации Prolog см. attr/2. При этом последний пример в 13.5.1 достигается с помощью attr(X, [cat-s, head-Head]), attr(Head, [agr-Agr, subj-Subj]), attr(Subj, [agr-Agr]), attr(Agr, [num-sg,pers-3]).. или maplist(attr, [X, Head, Subj, Agr], [[cat-s, head-Head], [agr-Agr, subj-Subj], [agr-Agr], [num-sg,pers-3]])..   -  person Will Ness    schedule 01.12.2018
comment
да, есть несколько реализаций пролога. Но мне это очень нужно в миниканрене.   -  person Matías Guzmán Naranjo    schedule 01.12.2018
comment
Четвертый запрос недействителен y не определен.   -  person amirouche    schedule 08.12.2018
comment
@MatíasGuzmánNaranjo Можете ли вы исправить четвертый запрос, в котором переменная y не определена, пожалуйста?   -  person amirouche    schedule 11.12.2018


Ответы (1)


Вы можете реализовать это, изменив код для унификации в вашей реализации миниканрена.

Однако я бы рекомендовал не использовать списки для представления структур объектов, вместо этого вы могли бы определить новый тип записи, содержащий список, который всегда заканчивается новой переменной, и один из них будет представлять структуру объектов. Затем вы по-прежнему можете использовать списки и другие объекты, а также иметь доступ к этим новым объектам.

Когда код объединения видит две структуры признаков, ему потребуется рекурсивно унифицировать все совпадающие ключи и расширить «остальную» часть каждого из них, чтобы она содержала поля, уникальные для другой структуры признаков (без деструктивной мутации).

person rain1    schedule 09.12.2018
comment
Мне удалось написать почти работающее решение, но оно застревает при обратном запросе, поскольку не может понять, что существует конечное число решений. Есть идеи, как это исправить? (Я добавил код в свой вопрос). - person Matías Guzmán Naranjo; 09.12.2018
comment
@MatíasGuzmánNaranjo Вы пытаетесь реализовать это в миниканрене. Я не рекомендую это. (Это не будет хорошо работать, потому что mk не имеет нелогических управляющих конструкций, которые есть в прологе, например cut). Вместо этого реализуйте его в схеме как дополнительную функцию к системе миниканрен. - person rain1; 09.12.2018
comment
Как вы думаете, почему для этого необходимо «вырезать»? И весь смысл этого в том, чтобы иметь отношение объединения, которое может идти в любом направлении. - person Matías Guzmán Naranjo; 10.12.2018
comment
Я не думаю, что вам следует использовать cut. Код пролога, который вы связали в вопросе, использует cut. Этот материал структуры функций не может быть выражен в чисто логическом коде mk. Именно поэтому вам нужно спуститься к схеме реализации унификации, чтобы написать это. При правильной реализации он будет двунаправленным, как и унификация. - person rain1; 10.12.2018
comment
тот факт, что программа mk не завершается, является, на мой взгляд, признаком того, что ее нужно вырезать. Я согласен с @rain1 и считаю, что реализация должна быть выполнена по схеме. - person amirouche; 11.12.2018
comment
Почему это нельзя выразить в коде mk? Любые конкретные идеи о том, как переписать унификацию в схеме? Мое предположение о том, почему он не находит окончательных ответов, заключается в том, что он проходит только один из списков и объединяет функции в этом списке со вторым списком, поэтому unify° не знает, что он также может выполнить процесс наоборот . - person Matías Guzmán Naranjo; 11.12.2018
comment
@rain1 Я думал, что condu подражает миниканрену. @matias Но если вы его используете, это означает, что он не будет двунаправленным сам по себе, как чистые предикаты ... Вы все равно можете написать предикат интерфейса, который будет проверять аргументы, решать, в каком направлении он должен работать, и вызывать соответствующий конкретный предикат. (теоретически на Прологе; не знаю, есть ли в миниканрене var/1, ground/1 и т. д.). - person Will Ness; 12.12.2018
comment
избегайте нелогических конструкций, таких как condu/condi/var/ground - person rain1; 16.12.2018
comment
condi, возможно, вы имели в виду conda. - person Will Ness; 16.12.2018