Lasse Reichstein Nielsen wrote:
> "Jens Axel Søgaard" <usenet@soegaard.net> writes:
>
>> Lasse Reichstein Nielsen wrote:
>
>>> Det er præcist det program jeg altid har haft lyst til
>>> at skrive,
>>
>> Har det noget med rollespil at gøre? [Hils Rune]
>
> Det har det. [Skal gøre, så ham igår :)]
[Takker]
> Jeg regner også med at det var Torbens grund til at lave
> programmet oprindeligt.
RPG næves i abstract, så mon ikke du har ret.
> Grunden til at jeg selv stoppede (ud over et ikke helt så
> gennemtænkt design) var at jeg ikke kunne få programmet
> effektivt nok til at give svaret på det jeg skulle bruge.
> I Roll bliver spørgsmålet:
>
> count =18 largest 6 7#sum largest 3 4#d6
>
> Altså sandsynligheden for et antal 18'ere for en bestem
> D&D karakter-rulle-metode. :)
>
> Roll kører på fjerde time allerede, så det var ikke
> løsningen på *det* problem, men ellers er det vældig
> sjovt at lege med :).
Hvor lang tid lod du den køre?
Torben skriver, at sum tager kvadratisk tid, så jeg gætter
på cirka
>(expt (expt 6 4) 2)
1679616
muligheder. Det burde lige akkurat være indenfor rækkevidde.
>> Ja - jeg er også blevet helt fascineret. Mon ikke man
>> skulle tage sig sammen og lave en neddroslet version.
>> Jeg leger lidt med tanken om at implementere det ved
>> hjælp af McCarthys amb (som jeg har kaldt vælg
>> nedenunder). Men det svære er selvfølgelig at gøre det
>> effektivt.
>
> Det tror jeg på. Brute force holder kun til meget
> begrænsede eksempler.
>
>> For dem der ikke kender amb, så kast et blik
>> på nedenstående.
>
> Det lyder som noget der kan laves med continuations
Det er det også. Det grundlæggende er
(define fejlfortsættelse 'dummy)
(define (initialiser-fejlfortsættelse)
(set! fejlfortsættelse
(lambda ()
(error "søgetræet er udtømt"))))
(initialiser-fejlfortsættelse)
(define-syntax vælg
(syntax-rules
()
( (vælg) (fejlfortsættelse) )
( (vælg udtryk1 udtryk2 ...) (let/cc return
(let ([tidligere-fejlfortsættelse fejlfortsættelse])
(let/cc fortsæt
(set! fejlfortsættelse
(lambda ()
(set! fejlfortsættelse tidligere-fejlfortsættelse)
(fortsæt 'fejl)))
(return udtryk1))
(vælg udtryk2 ...))) ) ))
En forklaring kan findes her:
http://download.plt-scheme.org/doc/200/html/t-y-scheme/t-y-scheme-Z-H-16.html#%_chap_14
Udfra det kan man så lave ekstra primitiver:
(define (kræv b)
(if (not b)
(vælg)))
(define (et-element-i elementer)
(kræv (not (empty? elementer)))
(vælg (car elementer) (et-element-i (cdr elementer))))
(define (tal-i-interval fra til)
(if (> fra til)
(vælg)
(vælg fra (tal-i-interval (+ fra 1) til))))
> for vælg-alle: continuations og store, men alt kan jo
> laves med dem :)
Næsten
Kender du Danvy og Filinskys "Abstracting Control",1990 ?
Kan hentes fra:
http://citeseer.nj.nec.com/danvy90abstracting.html
Der bruger de fortsættelser i flere lag. De har altså ikke bare
shift og reset, men shift-1, shift-2,... og reset-1, reset-2,... .
De har endda et godt eksempel (en gammel kending fra bl.a. SICP),
hvor det viser sig at være nyttigt.
> Det bliver det dog nok ikke effektivt af.
Jeg har også droppet amb-idéen igen. Men jeg sidder nu alligevel og
leger med at lavet noget roll-lignende. Det basale er på plads, men
man skal tænke sig grueligt godt om, for at gøre det lige så elegant
som Torben
--
Jens Axel Søgaard