module type QUEUE_FUN =
sig
type ' a t
val enqueue: ' a * ' a t -> ' a t
val dequeue: ' a t -> ' a t
val first: ' a t -> ' a
val isEmpty
: ' a t
-> bool end ;;
module QueueList : QUEUE_FUN =
struct
let empty ( ) = [ ]
let isEmpty queue = queue = [ ]
let enqueue ( x, queue) = queue @ [ x]
let dequeue queue =
match queue with
| [ ] -> [ ]
| _ :: q -> q
let first queue =
match queue with
| [ ] -> raise ( Empty "QueueList.first" )
| x :: _ -> x
end ;;
module QueueTwoLists : QUEUE_FUN =
struct
let empty ( ) = ( [ ] , [ ] )
let isEmpty queue = queue = ( [ ] , [ ] )
let enqueue ( x, queue) =
match queue with
| ( [ ] , [ ] ) -> ( [ x] , [ ] )
| ( [ ] , inbox
) -> ( List . rev inbox,
[ x
] ) | ( outbox, inbox) -> ( outbox, x :: inbox)
let dequeue queue =
match queue with
| ( [ ] , [ ] ) -> ( [ ] , [ ] )
| ( [ ] , inbox) ->
let _
:: outbox
= List . rev inbox
in ( outbox, [ ] )
| ( _ :: outbox, inbox) -> ( outbox, inbox)
let first queue =
match queue with
| ( [ ] , _) -> raise ( Empty "QueueTwoLists.first" )
| ( x :: _, _) -> x
end ;;
let test_queue empty enqueue dequeue first isEmpty name =
let test n axiom = if axiom then true else raise ( Axiom_fail ( name, n) ) in
let axiom1 = not ( isEmpty ( enqueue ( 42 , empty ( ) ) ) )
and axiom2 = isEmpty ( empty ( ) )
and axiom3 = dequeue ( enqueue ( 42 , enqueue ( 69 , empty ( ) ) ) ) =
enqueue ( 42 , dequeue ( enqueue ( 69 , empty ( ) ) ) )
and axiom4 = dequeue ( enqueue ( 42 , empty ( ) ) ) = empty ( )
and axiom5 = dequeue ( empty ( ) ) = empty ( )
and axiom6 = first ( enqueue ( 42 , enqueue ( 69 , empty ( ) ) ) ) = first ( enqueue ( 69 , empty ( ) ) )
and axiom7 = first ( enqueue ( 42 , empty ( ) ) ) = 42
in
( test 1 axiom1 ) &&
( test 2 axiom2 ) &&
(*
*( test 3 axiom3 ) &&
*)
( test 4 axiom4 ) &&
( test 5 axiom5 ) &&
( test 6 axiom6 ) &&
( test 7 axiom7 )
let test_queuelist =
test_queue QueueList. empty QueueList. enqueue QueueList. dequeue QueueList. first
QueueList. isEmpty "QueueList"
;;
let test_queuetwolists =
test_queue QueueTwoLists. empty QueueTwoLists. enqueue QueueTwoLists. dequeue QueueTwoLists. first
QueueTwoLists. isEmpty "QueueTwoLists"
;;
bW9kdWxlIHR5cGUgUVVFVUVfRlVOID0Kc2lnCiAgICB0eXBlICdhIHQKICAgIGV4Y2VwdGlvbiBFbXB0eSBvZiBzdHJpbmcKICAgIHZhbCBlbXB0eTogICB1bml0ICAgICAgLT4gJ2EgdAogICAgdmFsIGVucXVldWU6ICdhICogJ2EgdCAtPiAnYSB0CiAgICB2YWwgZGVxdWV1ZTogJ2EgdCAgICAgIC0+ICdhIHQKICAgIHZhbCBmaXJzdDogICAnYSB0ICAgICAgLT4gJ2EKICAgIHZhbCBpc0VtcHR5OiAnYSB0ICAgICAgLT4gYm9vbAplbmQ7OwoKbW9kdWxlIFF1ZXVlTGlzdCA6IFFVRVVFX0ZVTiA9CnN0cnVjdAogICAgdHlwZSAnYSB0ID0gJ2EgbGlzdAogICAgZXhjZXB0aW9uIEVtcHR5IG9mIHN0cmluZwogICAgCiAgICBsZXQgZW1wdHkgICAoKSAgICA9IFtdCiAgICAKICAgIGxldCBpc0VtcHR5IHF1ZXVlID0gcXVldWUgPSBbXQogICAgCiAgICBsZXQgZW5xdWV1ZSAoeCwgcXVldWUpID0gcXVldWUgQCBbeF0KICAgIAogICAgbGV0IGRlcXVldWUgcXVldWUgPQogICAgICAgIG1hdGNoIHF1ZXVlIHdpdGgKICAgICAgICAgICAgfCBbXSAgICAgLT4gW10KICAgICAgICAgICAgfCBfIDo6IHEgLT4gcQogICAgCiAgICBsZXQgZmlyc3QgcXVldWUgPQogICAgICAgIG1hdGNoIHF1ZXVlIHdpdGgKICAgICAgICAgICAgfCBbXSAgICAgLT4gcmFpc2UgKEVtcHR5ICJRdWV1ZUxpc3QuZmlyc3QiKQogICAgICAgICAgICB8IHggOjogXyAtPiB4CmVuZDs7Cgptb2R1bGUgUXVldWVUd29MaXN0cyA6IFFVRVVFX0ZVTiA9CnN0cnVjdAogICAgdHlwZSAnYSB0ID0gJ2EgbGlzdCAqICdhIGxpc3QKICAgIGV4Y2VwdGlvbiBFbXB0eSBvZiBzdHJpbmcKICAgIAogICAgbGV0IGVtcHR5ICgpID0gKFtdLCBbXSkKICAgIGxldCBpc0VtcHR5IHF1ZXVlID0gcXVldWUgPSAoW10sIFtdKQogICAgbGV0IGVucXVldWUgKHgsIHF1ZXVlKSA9CiAgICAgICAgbWF0Y2ggcXVldWUgd2l0aAogICAgICAgICAgICB8IChbXSwgW10pICAgICAgICAtPiAoW3hdLCBbXSkKICAgICAgICAgICAgfCAoW10sIGluYm94KSAgICAgLT4gKExpc3QucmV2IGluYm94LCBbeF0pCiAgICAgICAgICAgIHwgKG91dGJveCwgaW5ib3gpIC0+IChvdXRib3gsIHggOjogaW5ib3gpCiAgICBsZXQgZGVxdWV1ZSBxdWV1ZSA9CiAgICAgICAgbWF0Y2ggcXVldWUgd2l0aAogICAgICAgICAgICB8IChbXSwgW10pICAgIC0+IChbXSwgW10pCiAgICAgICAgICAgIHwgKFtdLCBpbmJveCkgLT4KICAgICAgICAgICAgICAgIGxldCBfIDo6IG91dGJveCA9IExpc3QucmV2IGluYm94IGluCiAgICAgICAgICAgICAgICAob3V0Ym94LCBbXSkKICAgICAgICAgICAgfCAoXyA6OiBvdXRib3gsIGluYm94KSAtPiAob3V0Ym94LCBpbmJveCkKICAgIGxldCBmaXJzdCBxdWV1ZSA9CiAgICAgICAgbWF0Y2ggcXVldWUgd2l0aAogICAgICAgICAgICB8IChbXSwgXykgICAgIC0+IHJhaXNlIChFbXB0eSAiUXVldWVUd29MaXN0cy5maXJzdCIpCiAgICAgICAgICAgIHwgKHggOjogXywgXykgLT4geAplbmQ7OwoKZXhjZXB0aW9uIEF4aW9tX2ZhaWwgb2Ygc3RyaW5nICogaW50OzsKCmxldCB0ZXN0X3F1ZXVlIGVtcHR5IGVucXVldWUgZGVxdWV1ZSBmaXJzdCBpc0VtcHR5IG5hbWUgPQogICAgbGV0IHRlc3QgbiBheGlvbSA9IGlmIGF4aW9tIHRoZW4gdHJ1ZSBlbHNlIHJhaXNlIChBeGlvbV9mYWlsIChuYW1lLCBuKSkgaW4KICAgIGxldCBheGlvbTEgPSBub3QgKGlzRW1wdHkgKGVucXVldWUgKDQyLCBlbXB0eSAoKSkpKQogICAgYW5kIGF4aW9tMiA9IGlzRW1wdHkgKGVtcHR5ICgpKQogICAgYW5kIGF4aW9tMyA9IGRlcXVldWUgKGVucXVldWUgKDQyLCBlbnF1ZXVlICg2OSwgZW1wdHkgKCkpKSkgPQogICAgICAgICAgICAgICAgIGVucXVldWUgKDQyLCBkZXF1ZXVlIChlbnF1ZXVlICg2OSwgZW1wdHkgKCkpKSkKICAgIGFuZCBheGlvbTQgPSBkZXF1ZXVlIChlbnF1ZXVlICg0MiwgZW1wdHkgKCkpKSA9IGVtcHR5ICgpCiAgICBhbmQgYXhpb201ID0gZGVxdWV1ZSAoZW1wdHkgKCkpID0gZW1wdHkgKCkKICAgIGFuZCBheGlvbTYgPSBmaXJzdCAoZW5xdWV1ZSAoNDIsIGVucXVldWUgKDY5LCBlbXB0eSAoKSkpKSA9IGZpcnN0IChlbnF1ZXVlICg2OSwgZW1wdHkgKCkpKQogICAgYW5kIGF4aW9tNyA9IGZpcnN0IChlbnF1ZXVlICg0MiwgZW1wdHkgKCkpKSA9IDQyCiAgICBpbgogICAgICAgICggdGVzdCAxIGF4aW9tMSApICYmCiAgICAgICAgKCB0ZXN0IDIgYXhpb20yICkgJiYKICAgICAgICAoKgogICAgICAgICAqKCB0ZXN0IDMgYXhpb20zICkgJiYKICAgICAgICAgKikKICAgICAgICAoIHRlc3QgNCBheGlvbTQgKSAmJgogICAgICAgICggdGVzdCA1IGF4aW9tNSApICYmCiAgICAgICAgKCB0ZXN0IDYgYXhpb202ICkgJiYKICAgICAgICAoIHRlc3QgNyBheGlvbTcgKQoKbGV0IHRlc3RfcXVldWVsaXN0ID0KICAgIHRlc3RfcXVldWUgUXVldWVMaXN0LmVtcHR5IFF1ZXVlTGlzdC5lbnF1ZXVlIFF1ZXVlTGlzdC5kZXF1ZXVlIFF1ZXVlTGlzdC5maXJzdAogICAgICAgICAgICAgICBRdWV1ZUxpc3QuaXNFbXB0eSAiUXVldWVMaXN0Igo7OwoKbGV0IHRlc3RfcXVldWV0d29saXN0cyA9CiAgICB0ZXN0X3F1ZXVlIFF1ZXVlVHdvTGlzdHMuZW1wdHkgUXVldWVUd29MaXN0cy5lbnF1ZXVlIFF1ZXVlVHdvTGlzdHMuZGVxdWV1ZSBRdWV1ZVR3b0xpc3RzLmZpcnN0CiAgICAgICAgICAgICAgIFF1ZXVlVHdvTGlzdHMuaXNFbXB0eSAiUXVldWVUd29MaXN0cyIKOzsK
compilation info
File "prog.ml", line 65, characters 8-14:
Warning Y: unused variable axiom3.
File "prog.ml", line 50, characters 20-31:
Warning P: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
[]
stdout