Kymorph/Remaining transducer issues/п deletion and voicing conflict

From Apertium
Jump to navigation Jump to search

The problem

The environment

  • п should delete between a low vowel and a morpheme boundary followed by {I}п
    • e.g., тап>{I}п : таап, теп>{I}п : тээп (everything else needed for these rules works)
  • п should voice (to б) in all other intervocalic positions
    • e.g., тап>{A} : таба, теп>{A} : тебе
    • also: кап>{I} : кабы, кеп>{I} : кеби

The basic rules

  • "Intervocalic voicing of п"
п:б <=> :SurVow (:0) _ %>: (:0) :SurVow ;
  • "Deletion of п at end of verb stem in <cv_perf>"
п:0 <=> :LowVow _ %>: %{I%}: п ;

The conflict

As expected, the following conflict results from these two rules being present in the same .twol file:

There is a <=-rule conflict between "Intervocalic voicing of п" and "Deletion of п at end of verb stem in <cv_perf>".
E.g. in context {I}:и >: ё:ё _ >: {I}:и п:п 
WARNING! The conflict is unresolvable.

What needs to be done

Somehow, the voicing rule's environment needs to exclude the entire environment of the deletion rule.

How to do it

It might be possible with what's suggested in the twolc book on pp. 49-54.

How not to do it

  • Simply subtracting the deletion rule's environment from the voicing rule's environment is impossible because _ cannot be contained in such subtractions.
  • Subtracting the more restrictive rule's left (x) and right (y) environments from the more general rule's left (a) and right (b) environments (respectively, resulting in [ a - x ] _ [ b - y ]) doesn't work either, because then it fails to apply the more general [voicing] rule after e.g., any x environment, not just when any y follows.
  • Using <= and => instead of <=> does not seem to be a possible solution.

Possible solutions

Multiple context subtraction example

$ svn diff apertium-tr-ky.ky.twol
Index: apertium-tr-ky.ky.twol
===================================================================
--- apertium-tr-ky.ky.twol      (revision 32117)
+++ apertium-tr-ky.ky.twol      (arbetskopia)
@@ -50,6 +50,8 @@
 BackLowRndVow = О о Ё ё ;
 LowVow = Е е Э э Ө ө А а Я я О о Ё ё ; ! АА аа ЭЭ ээ ӨӨ өө ОО оо ;
 YotVow = Я я Е е Ё ё Ю ю ;
+UnlowVow = И У Ү Ы Ю
+           и у ү ы ю ;

 NasalCns = м н ң
            М Н Ң ;
@@ -136,7 +138,11 @@
 !п:б <=> :SurVow _ %>: [ [ (:0) :SurVow ] - $[ %{I%}: п ] ] ;
 !п:б <=> :SurVow _ %>: [ [ (:0) :SurVow ] - [ %{I%}: п ] ] ;
 !п:б <=> :SurVow (:0) _ %>: (:0) [ :SurVow - %{I%}:LowVow ] ;
-п:б <=> :SurVow (:0) _ %>: (:0) :SurVow ;
+
+п:б <=> :UnlowVow (:0) _ %>: (:0) [ [:SurVow - %{I%}:] [:* - п]* | %{I%}: ] .#. ;
+        :UnlowVow (:0) _ %>: (:0) :SurVow ;
+        :SurVow (:0)   _ %>: (:0) [ [:SurVow - %{I%}:] [:* - п]* | %{I%}: ] .#. ;
+
 !п:б => :SurVow (:0) _ %>: (:0) :SurVow ;
 !п:б <= :SurVow (:0) _ %>: (:0) :SurVow ;
 !п:б <=> [ [ :SurVow :* ] - [ :LowVow :* ] ] (:0) _ %>: (:0) [ [ :* :SurVow ] - [ :* %{I%}: п [ :Cns | .#. ] ] ] ;
@@ -310,15 +316,15 @@
   LastVowel  in  (  и  ү  е  э  ө  я  а  ё  о  ы  ю  у )
            matched ;

-"Deletion of all the other {I}s in {I}п <cv_perf>"
-%{I%}:0 <=> [ :SurVow - м:SurVow ] %>: _ п ;
+!"Deletion of all the other {I}s in {I}п <cv_perf>"
+!%{I%}:0 <=> [ :SurVow - м:SurVow ] %>: _ п ;

 !!"Deletion of п at end of verb stem before {I}п <cv_perf>"
 !!п:0 <=> :LowVow _ %>: %{I%}: п ;

-!"Deletion of п at end of verb stem in <cv_perf>"
+"Deletion of п at end of verb stem in <cv_perf>"
 !!п:0 <=> _ %>: %{I%}:0 п ;
-!п:0 <=> :LowVow _ %>: %{I%}: п ;
+п:0 <=> :LowVow _ %>: %{I%}: п ;
 !!п:0 <= :LowVow _ %>: %{I%}: п ;
 !!п:0 <=> :LowVow _ %>: %{I%}: п [ :Cns | .#. ] ;

Implementation with above and problems

  • Relevant rules:
"Intervocalic voicing of п everywhere except in <cv_perf>"
п:б <=> :HighVow _ %>: [ [:SurVow - %{I%}:] [:* - п]* | %{I%}: ]/[ :0 ] .#. ;
        :HighVow _ %>: :SurVow/:0 ;
        :SurVow  _ %>: [ [:SurVow - %{I%}:] [:* - п]* | %{I%}: ]/[ :0 ] .#. ;

"Vowel deletion for archiphoneme {I}"
%{I%}:0 <=> [ :SurVow ]/[ [ :0 - й:0 ] | %>: ] _ \[ п | р:0 ] ;

"Vowel harmony for archiphoneme {I}"
%{I%}:Vy <=> [ :LastVowel Cns* [ :Cns - [ й: | %{I%}:LabialCns | %{n%}: ] ] ]/[ %>: | :0 ] _ \[ р:0 | п: ] ;
  where  Vy  in  (  и  ү  и  и  ү  ы  ы  у  у  ы  у  у )
  LastVowel  in  (  и  ү  е  э  ө  я  а  ё  о  ы  ю  у )
           matched ;


"Vowel harmony for archiphoneme {I} before п in <cv_perf>"
%{I%}:Vy <=> [ [ :LastVowel ] Cns* [ Cns - [ й: | LabialCns ] ] ]/[ :0 | %>: ]  _ п ;
  where  Vy  in  (  и  ү  и  и  ү  ы  ы  у  у  ы  у  у )
  LastVowel  in  (  и  ү  е  э  ө  я  а  ё  о  ы  ю  у )
           matched ;

"Deletion of all the other {I}s in {I}п <cv_perf>"
%{I%}:0 <=> [ :SurVow - м:SurVow ] %>: _ п ;

"Deletion of п at end of verb stem in <cv_perf>"
п:0 <=> :LowVow _ %>: %{I%}: п ;
  • Current issues:
    • Conflict (albeit "resolved"):
There is a <=-rule conflict between "Intervocalic voicing of п everywhere except in <cv_perf>" and "Deletion of п at end of verb stem in <cv_perf>".
E.g. in context {I}:и ё:ё _ >: {I}: п:п 
Resolving the conflict by restricting the context of "Intervocalic voicing of п everywhere except in <cv_perf>".
    • forms not getting processed:
      • т а р а п > {S} {I} {n} > {D} {A} н : тарабынан (instead тарапынан)
      • к и т е п > {S} {I} {n} : китеби (instead китепи)