Etikettarkiv: lingvistik

Parentesfrågan

Läsaren har högst antagligen en uppfattning om vad parenteser är och vad deras roll är i en mening. Parenteser (trots namnet) är alltså inte teser, utan de ”… förtydligar, kommenterar, förklarar eller innebär ett sidospår från den övriga texten” (copy paste från Wikipedia). Med ”parenteser” menar jag förstås rundparenteser och inte hak-, klammer-, vinkel- eller piggparenteser, fastän samma grundprincip gäller också för dem.

Inom matematikens teoretiska drömvärld, till skillnad från naturliga språk, används parenteser för att ”ange grupper av termer […] för ordningen av räkneoperationer” (Wikipedia). Vi kan därmed säga att i matematiken har parenteserna olik semantik, vilket leder oss till en fråga: Vilken roll borde parenteser ha inom programmering?

Programmering är till stor del matematik. De första programmeringsstrukturerna härstammade från rena matematiska modeller som förverkligades med hjälp av elektronrör och senare mikroelektronik. Vi tar två konkreta exempel för att illustrera hur parenteser vanligtvis används inom programmering.

(defn kvadrat-summa [n]; summerar n första kvadraterna
(loop [i 0 resultat 0]; sätter variablerna 'i' och 'resultat' som 0
(if (<= i n)
(recur (inc i) (+ resultat (* i i)))
resultat
)))

(print (kvadrat-summa 5))

Ovan är Clojure kod som spottar ut summan på de fem första kvadrattalen. Clojure tillhör LISP familjen av programmeringsspråk där parenteser strukturerar programmet. Notera att all kod är omringad av parenteser som skapar en hierarki av funktioner och värden. Förklarningar och kommentarer placeras inte inom parenteser, utan inleds med semikolon. Koden kan köras här för de intresserade.

!gfortran, gcc version 5.4.0 20160609
!Summerar n första kvadraterna
integer function kvadrat_summa(n) result(summa)
real :: lista(n)

lista = (/(i, i=1,n, 1)/)
lista = lista*lista
summa = sum(lista)
end function kvadrat_summa

program P
print *, kvadrat_summa(5)
end program P

Som ett mindre extremt exempel på parenteser inom programmering kan vi betrakta ett bekant språk för fysiker, Fortran! Du kan köra koden här. Se hur parenteser används för att:

  • generera listor,
  • definiera funktionens resultat samt listans storlek, och
  • för att gruppera parametrar givna till funktioner.

Vi ser att parenteser behandlas liknande som inom matematiken, men varför så? Borde inte kod sträva efter att vara så naturligt läsbart som möjligt?

Svaret på första frågan är simpel; programmeringsspråk skapas av datanördar och inte lingvister. Men för att exemplifiera att naturliga parenteser är möjliga (och kanske även vettiga) inom programmering skrev jag nedan ett exempel på ett påhittat Python-liknande språk. Parenteserna fungerar som kommentarer eller tillägger extra detaljer.

(heltals) funktion kvadrat_summan på n (ett heltal):
(summerar n första kvadraterna)
i = 0
resultat = 0
medan i <= n:
resultat += i * i
i += 1
resultat

visa kvadrat_summan på 5

Mycket snyggare och klarare kod, inte sant? Bara om nån skulle hitta på ett liknande språk som också är körbart…

Fortsättning följer!

Dricker du så dricker jag

Det är dags för en till ramble om matematisk logik.
Observera följande påstående:
”I varje bar finns en person så att om han dricker, dricker alla.”

Är påståendet sant eller falskt? Intuitivt låter det ju som total nonsense, men meningen kan granskas exakt med hjälp av predikatlogik.

Då vi betecknar personer i baren med x och y, fås följande symboliska form:
\exists x (D(x) \to \forall y D(y))

Kort förklaring:

  • \exists x betyder ”det existerar x så att…”
  • \forall y betyder ”för alla y gäller…”
  • D(x) innebär ”x dricker”
  • \to är en implikation, som har följande sanningstabell:

Två distinkta situationer gäller nu för baren:
Om alla i baren dricker, kan vi välja vilken som helst person y. Då är y en sådan person, att om han dricker, dricker alla.
Om det föregående inte gäller, finns det en person x i baren som inte dricker. Nu är båda påståendena D(x) och \forall y D(y) falska, så enligt sanningstabellen ovan är implikationen sann.

Tolkat i predikatlogik är alltså påståendet alltid sant, dvs. vi har en tautologi. Detta kan även verifieras exakt t.ex. med Tarskis sanningsdefinition.

Men beakta nu följande situation med tre personer på en bar:

Alla personerna dricker vid något skede, men ingen av dem får alla andra att dricka samtidigt. Nu verkar påståendet igen inte stämma, what gives?

Vad vi nyss har diskuterat är Drinker Paradox, som i själva verket inte är en paradox, men illustrerar hur matematisk logik inte alltid stämmer överens med naturligt språk. Skillnaden ligger i hur implikationer tolkas: i naturligt språk är en implikation inte meningsfull ifall premissen är falsk. Däremot har logikens s.k. materiella implikation ingen sådan begränsning: en levande person som påstår ”om jag är död lever jag förevigt” skulle tala sanning enligt denna modell.

Då vi ännu återgår till baren och figuren ovan, märker vi att logik inte tar tidsdimensionen i beaktande. Påståendet gäller bara som en materiell implikation då en specifik tidpunkt fixeras. Detta är meningsfullt, eftersom kunder kan anlända till och lämna baren, och i synnerhet kan vi inte tala om drickande personer ifall baren är tom.

Den materiella implikationen är inte onödig eller meningslös inom matematik, men tolkat inom en vanlig mening kan vi formulera väldigt underhållande ”sanna” påståenden. Om du vill hitta på egna: ersätt x och y med andra personer eller föremål, och D med någon annan egenskap än ”dricker”, så får du t.ex.

”I varje godispåse finns en karamell så att om den är choklad, 
är alla karameller choklad.”

”I varje ämnesförening finns en person så att om han är vegan, 
är alla veganer.”

”I varje människokropp finns ett ben så att om det benet bryts, 
bryts alla ben.”