Как определить унификация и включение в состав структуры признаков в миниканрене, если мы представляем структуры признаков со списками ?
Общее поведение будет примерно таким (я думаю):
(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)))])))
(a b)
совместимо с(c d)
во 2-м примере, а(a b)
несовместимо с(a d)
в 3-м примере? - person Alex Knauth   schedule 25.11.2018attr/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.2018y
не определен. - person amirouche   schedule 08.12.2018y
не определена, пожалуйста? - person amirouche   schedule 11.12.2018