国产人妻人伦精品_欧美一区二区三区图_亚洲欧洲久久_日韩美女av在线免费观看

合肥生活安徽新聞合肥交通合肥房產生活服務合肥教育合肥招聘合肥旅游文化藝術合肥美食合肥地圖合肥社保合肥醫院企業服務合肥法律

代做COMP2209、代寫Java,Python程序

時間:2024-01-06  來源:合肥網hfw.cc  作者:hfw.cc 我要糾錯



COMP2209 Assignment Instructions

Learning Outcomes (LOs)

 Understand the concept of functional programming and be able to write programs in this style,

 Reason about evaluation mechanisms.

Introduction

This assignment asks you to tackle some functional programming challenges to further improve your

functional programming skills. Four of these challenges are associated with interpreting, translating,

analysing and parsing a variation of the lambda calculus. It is hoped these challenges will give you

additional insights into the mechanisms used to implement functional languages, as well as

practising some advanced functional programming techniques such as pattern matching over

recursive data types, complex recursion, and the use of monads in parsing. Your solutions need not

be much longer than a page or two, but more thought is required than with previous Haskell

programming tasks you have worked on. There are three parts to this coursework and each of them

has two challenges. Each part can be solved independently of the others and they are of varying

difficulty, thus, it is recommended that you attempt them in the order that you find easiest.

For ease of comprehension, the examples in these instructions are given in a human readable format

you may wish to code these as tests in Haskell. To assist with a semi-automated assessment of this

coursework we will provide a file called Challenges.hs. This contains Haskell code with signatures for

the methods that you are asked to develop and submit. You should edit and submit this file to

incorporate the code you have developed as solutions. However, feel free to take advantage of

Haskell development tools such as Stack or Cabal as you wish. You may and indeed should define

auxiliary or helper functions to ensure your code is easy to read and understand. You must not,

however, change the signatures of the functions that are exported for testing in Challenges.hs.

Likewise, you may not add any third-party import statements, so that you may only import modules

from the standard Haskell distribution. If you make such changes, your code may fail to compile on

the server used for automatic marking, and you will lose a significant number of marks.

There will be no published test cases for this coursework beyond the simple examples given here - as

part of the development we expect you to develop your own test cases and report on them. We will

apply our own testing code as part of the marking process. To prevent anyone from gaining

advantage from special case code, this test suite will only be published after all marking has been

completed.

It is your responsibility to adhere to the instructions specifying the behaviour of each function, and

your work will not receive full marks if you fail to do so. Your code will be tested only on values

satisfying the assumptions stated in the description of each challenge, so you can implement any

error handling you wish, including none at all. Where the specification allows more than one

possible result, any such result will be accepted. When applying our tests for marking it is possible

Module: Programming III Examiners

:

Julian Rathke,

Nick Gibbins

Assignment: Haskell Programming Challenges Effort: 30 to 60 hours

Deadline: 16:00 on 11/1/2024 Feedback: 2/2/2024 Weighting: 40%

your code will run out of space or time. A solution which fails to complete a test suite for one

exercise within 15 seconds on the test server will be deemed to have failed that exercise and will

only be eligible for partial credit. Any reasonably efficient solution should take significantly less time

than this to terminate on the actual test data that will be supplied.

Depending on your proficiency with functional programming, the time required for you to implement

and test your code is expected to be 5 to 10 hours per challenge. If you are spending much longer

than this, you are advised to consult the teaching team for advice on coding practices.

Note that this assignment involves slightly more challenging programming compared to the previous

functional programming exercises. You may benefit, therefore, from the following advice on

debugging and testing Haskell code:

https://wiki.haskell.org/Debugging

https://www.quora.com/How-do-Haskell-programmers-debug

http://book.realworldhaskell.org/read/testing-and-quality-assurance.html

It is possible you will find samples of code on the web providing similar behaviour to these

challenges. Within reason, you may incorporate, adapt and extend such code in your own

implementation. Warning: where you make use of code from elsewhere, you must acknowledge and

cite the source(s) both in your code and in the bibliography of your report. Note also that you

cannot expect to gain full credit for code you did not write yourself, and that it remains your

responsibility to ensure the correctness of your solution with respect to these instructions.

The Challenges

Part I  C Circuit Puzzles

In these two challenges we will introduce a type of circuit puzzle in which the solver is presented

with a grid of "tiles" each with "wires" printed on them. The solver is then expected to rotate each

tile in the grid so that all of the wires connect together to form a complete circuit. Moreover, each

puzzle will contain at least one tile that is a "source" tile for the circuit, and at least one tile that is a

"sink" tile. A completed circuit will ensure that every sink is reachable from a source and vice-versa.

There may however be multiple sources and multiple sinks.

The grid may be of any rectangular size and will be given as a list of non-empty lists of Tile values. A

Tile value is value of the data type given by:

data Edge = North | East | South | West deriving (Eq,Ord,Show,Read)

data Tile = Source [ Edge ] | Sink [ Edge ] | Wire [ Edge ] deriving (Eq,Show,Read)

type Puzzle = [ [ Tile ] ]

where a Tile simply lists which of its edges offer connection of wires. The Source and Sink tiles must

contain at least one connector edge and Wire tiles must contain either zero (an empty Tile) or at

least two connector edges. Duplicate entries in the edges list are ignored and order does not matter.

Connector edges are considered to connect across two Tiles if they share a connector edge. For

example, a Tile offering a West connector placed to the right of a Tile offering an East connector

would have a connecting wire. A Wire Tile is connected if all of its connector edges are connected.

Similarly Source and Sink tiles are connected if, all of their connector edges are connected.

Example tiles are as follows :

Source [ West ] could be represented visually as

Sink [ North, West ] could be represented visually as

Wire [ East, South ] could be represented visually as

and finally

Wire [ North, East , West ] could be represented visually as

An example 3x3 puzzle is given below followed by a visual representation of the puzzle:

[ [ Wire [North,West] , Wire [North,South] , Source [North] ],

[ Wire [North,West], Wire [East,West], Wire [North,East] ],

[ Sink [West] , Wire [North,South] , Wire [North,West] ] ]

The following image shows a solution to the above puzzle obtained by rotating each of the Tiles.

Note the completed circuit in the solution.

Challenge 1: Completedness of circuits.

The first challenge requires you to define a function

isPuzzleComplete :: Puzzle -> Bool

that, given a list of list of tiles, simply returns whether the puzzle is completed. That is, this function

returns True if and only if all Tiles are connected, for every Source tile, there exists a path following

the wires to at least one Sink tile and for every Sink tile, there is a path following the wires to at least

one Source tile.

Challenge 2: Solve a Circuit Puzzle

This challenge requires you to define a function

solveCircuit :: Puzzle -> Maybe [ [ Rotation ] ]

where data Rotation = R0 | R** | R180 | R270 deriving (Eq,Show,Read)

This function should, given a circuit puzzle, return Just of a grid of rotations such that, if the rotations

were applied to the corresponding Tile in the input grid, the resulting Puzzle will be a completed

circuit. Where this is not possible, the function should return the Nothing value.

The values of Rotation represent

 R0 no rotation

 R** rotate Tile clockwise ** degrees around the centre of the tile

 R180 rotate Tile clockwise 180 degrees around the centre of the tile

 R270 rotate Tile clockwise 270 degrees around the centre of the tile

For example,

solveCircuit [ [ Wire [North,West] , Wire [North,South] , Source [North] ], [ Wire [North,West], Wire

[East,West], Wire [North,East] ], [ Sink [West] , Wire [North,South] , Wire [North,West] ] ]

could return

Just [[R180,R**,R270],[R**,R0,R180],[R180,R**,R0]]

note that this solution is not unique.

Part II  C Parsing and Printing

You should start by reviewing the material on the lambda calculus given in the lectures. You may

also review the Wikipedia article, https://en.wikipedia.org/wiki/Lambda_calculus, or Selinger's

notes http://www.mscs.dal.ca/~selinger/papers/papers/lambdanotes.pdf, or both.

For the remaining challenges we will be working with a variant of the Lambda calculus that support

let-blocks, discard binders and pairing. We call this variant Let_x and the BNF grammar for this

language is as follows

Expr ::= Var | Expr Expr | "let" Eqn "in" Expr | "(" Expr ")"

| "(" Expr "," Expr ")" | "fst" "("Expr")" | "snd" "("Expr")" | "\" VarList "->" Expr

Eqn ::= VarList "=" Expr

VarList ::= VarB | VarB VarList

VarB ::= "x" Digits | "_"

Var ::= "x" Digits

Digits ::= Digit | Digit Digits

Digit ::= "0" | "1" | "2" | "3" | "4" | "5" | "6 " | "7" | "8" | "9"

The syntax "let x1 x2 ... xN = e1 in e2" is syntactic sugar for "let x1 = \x2 -> ... -> \xN -> e1 in e2" and

the syntax "\x1 x2 ... xN    e" is syntactic sugar for "\x1 -> \x2 -> ... -> xN -> e".

We can use the underscore "_" character to represent a discard binder that can be used in place of a

variable where no binding is required. Pairing of expressions is represented as "(e1,e2)" and there is

no pattern matching in this language so we use "fst" and "snd" to extract the respective components

of a paired expression. For the purposes of this coursework we limit the use of variable names in the

lambda calculus to those drawn from the set "x0 , x1, x2, x3, ... ", that is "x" followed by a natural

number. An example expression in the language is

let x2 x3 _ = x0 in fst ((x2 x4 x5 , x2 x5 x4)) snd ((x2 x4 x5 , x2 x5 x4))

Application binds tightly here and is left associative so "let x = e1 in e2 e3 e4" is to be understood as

"let x = e1 in ((e2 e3) e4)".

Challenge 3: Pretty Printing a Let_x Expression

Consider the datatypes

data LExpr = Var Int | App LExpr LExpr | Let Bind LExpr LExpr | Pair LExpr LExpr | Fst LExpr | Snd LExpr | Abs Bind LExpr

deriving (Eq,Show,Read)

data Bind = Discard | V Int

deriving (Eq,Show,Read)

We use LExpr to represent Abstract Syntax Trees (AST) of the Let_x language.

This challenge requires you to write a function that takes the AST of a Let_x expression and to "pretty

print" it by returning a string representation the expression. That is, define a function

prettyPrint :: LExpr -> String

that outputs a syntactically correct expression of Let_x. Your solution should omit brackets where

these are not required and the output string should parse to the same abstract syntax tree as the

given input. Finally, your solution should print using sugared syntax where possible. For example, an

expression given as Let (V 1) (Abs (V 2) (Abs Discard e1)) e2 should be printed as "let x1 x2 _ = <e1>

in <e2>" where e1 and e2 are expressions and <e1> and <e2> are their pretty print strings.

Beyond that you are free to format and lay out the expression as you choose in order to make it

shorter or easier to read or both.

Example usages of pretty printing (showing the single \ escaped using \\) are:

Challenge 4: Parsing Let_x Expressions

In this Challenge we will write a parser for the Let_x language using the datatype LExpr given above.

Your challenge is to define a function:

parseLetx :: String -> Maybe LExpr

that returns Nothing if the given string does not parse correctly according to the rules of the

concrete grammar for Let_x and returns a valid Abstract Syntax Tree otherwise.

You are recommended to adapt the monadic parser examples published by Hutton and Meijer. You

should start by following the COMP2209 lecture on Parsing, reading the monadic parser tutorial by

Hutton in Chapter 13 of his Haskell textbook, and/or the on-line tutorial below:

http://www.cs.nott.ac.uk/~pszgmh/pearl.pdf on-line tutorial

Example usages of the parsing function are:

App (Abs (V 1) (Var 1)) (Abs (V 1) (Var 1))"(\\x1 -> x1) \\x1 -> x1"

Let Discard (Var 0) (Abs (V 1) (App (Var 1) (Abs (V 1) (Var 1)))) "let _ = x0 in \\x1 -> x1 \\x1 -> x1"

Abs (V 1) (Abs Discard (Abs (V 2) (App (Var 2 ) (Var 1 ) ) ) ) "\\x1 _ x2 -> x2 x1"

App (Var 2) (Abs (V 1) (Abs Discard (Var 1))) "x2 \\x1 _ -> x1"

parseLetx "x1 (x2 x3)" Just (App (Var 1) (App (Var 2) (Var 3)))

parseLetx "x1 x2 x3" Just (App (App (Var 1) (Var 2)) (Var 3))

parseLetx "let x1 x3 = x2 in x1 x2" Just (Let (V 1) (Abs (V 3) (Var 2)) (App (Var 1) (Var 2)))

parseLetx "let x1 _ x3 = x3 in \\x3 ->

x1 x3 x3"

Just (Let (V 1) (Abs Discard (Abs (V 3) (Var 3)))

(Abs (V 3) (App (App (Var 1) (Var 3)) (Var 3))))

Part III  C Encoding Let_x in Lambda Calculus

It is well known that the Lambda Calculus can be used to encode many programming constructs. In

particular, to encode a let blocks we simply use application

<let x0 = e1 in e2> is encoded as (\x0 -> <e2>) <e1> where <e1> and <e2> are the encodings of

e1 and e2 respectively.

To encode the discard binder we simply need to choose a suitable variable with which to replace it:

<\ _ -> e1 > is encoded as (\xN -> <e1>) where xN is chosen so as to not interfere with <e1>

Finally, pairing can be encoded as follows:

< (e1 , e2)> is encoded as (\xN- > xN <e1> <e2> ) where xN does not interfere with <e1> and <e2>

and

<fst e> is encoded as <e> (\x0 - > \x1 - > x0)

<snd e> is encoded as <e> (\x0 - > \x1 - > x1)

Challenge 5: Converting Arithmetic Expressions to Lambda Calculus

Given the datatype

data LamExpr = LamVar Int | LamApp LamExpr LamExpr | LamAbs Int LamExpr

deriving (Eq,Show,Read)

Write a function

letEnc :: LExpr -> LamExpr

that translates an arithmetic expression in to a lambda calculus expression according to the above

translation rules. The lambda expression returned by your function may use any naming of the

bound variables provided the given expression is alpha-equivalent to the intended output.

Usage of the letEnc function on the examples show above is as follows:

letEnc (Let Discard (Abs (V 1) (Var 1)) (Abs (V 1) (Var 1)) LamApp (LamAbs 0 (LamAbs 2

(LamVar 2))) (LamAbs 2 (LamVar

2))

letEnc (Fst (Pair (Abs (V 1) (Var 1)) (Abs Discard (Var 2)))) LamApp (LamAbs 0 (LamApp

(LamApp (LamVar 0) (LamAbs 2

(LamVar 2))) (LamAbs 0 (LamVar

2)))) (LamAbs 0 (LamAbs 1

(LamVar 0)))

Challenge 6: Counting and Comparing Let_x Reductions

For this challenge you will define functions to perform reduction of Let_x expressions. We will

implement both a call-by-value and a call-by-name reduction strategy. A good starting point is to

remind yourself of the definitions of call-by-value and call-by-name evaluation in Lecture 34 -

Evaluation Strategies.

We are going to compare the differences between the lengths of reduction sequences to

terminated for both call-by-value and call-by-name reduction for a given Let_x expression and the

lambda expression obtained by converting the Let_x expression to a lambda expression as defined in

Challenge 5. For the purposes of this coursework, we will consider an expression to have terminated

for a given strategy if it simply has no further reduction steps according to that strategy. For example,

blocked terms such as "x1 x2" are considered as terminated.

In order to understand evaluation in the language of Let_x expressions, we need to identify the

redexes of that language. The relevant reduction rules are as follows:

also note that, in the expressions "let x1 = e1 in e2" or "let _ = e1 in e2" the expression "e2" occurs

underneath a binding operation and therefore, similarly to "\x1 -> e2", according to both call-by-

value and call-by-name strategies, reduction in "e2" is suspended until the binder is resolved.

Define a function:

compareRedn :: LExpr -> Int -> ( Int, Int , Int, Int )

that takes a Let_x expression and upper bound for the number of steps to be counted and returns a

4-tuple containing the length of four reduction sequences. In each case the number returned should

be the minimum of the upper bound and the number of steps needed for the expression to

terminate. Given an input Let_x expression E, the pair should contain lengths of reduction

sequences for (in this order) :

1. termination using call-by-value reduction on E

2. termination using call-by-value reduction on the lambda calculus translation of E

3. termination using call-by-name reduction on E

4. termination using call-by-name reduction on the lambda calculus translation of E

Example usages of the compareRedn function are:

compareRedn (Let (V 3) (Pair (App (Abs (V 1) (App (Var 1) (Var

1))) (Abs (V 2) (Var 2))) (App (Abs (V 1) (App (Var 1) (Var 1))) (Abs

(V 2) (Var 2)))) (Fst (Var 3))) 10

(6,8,4,6)

compareRedn (Let Discard (App (Abs (V 1) (Var 1)) (App (Abs

(V 1) (Var 1)) (Abs (V 1) (Var 1)))) (Snd (Pair (App (Abs (V 1)

(Var 1)) (Abs (V 1) (Var 1))) (Abs (V 1) (Var 1))))) 10

(5,7,2,4)

compareRedn (Let (V 2) (Let (V 1) (Abs (V 0) (App (Var 0) (Var

0))) (App (Var 1) (Var 1))) (Snd (Pair (Var 2) (Abs (V 1) (Var

1))))) 100

(100,100,2,4)

Implementation, Test File and Report

In addition to your solutions to these programming challenges, you are asked to submit an additional

Tests.hs file with your own tests, and a report:

You are expected to test your code carefully before submitting it and we ask that you write a report

on your development strategy. Your report should include an explanation of how you implemented

and tested your solutions. Your report should be up to 1 page (400 words). Note that this report is

not expected to explain how your code works, as this should be evident from your commented code

itself. Instead you should cover the development and testing tools and techniques you used, and

comment on their effectiveness.

Your report should include a second page with a bibliography listing the source(s) for any fragments

of code written by other people that you have adapted or included directly in your submission.

Submission and Marking

Your Haskell solutions should be submitted as a single plain text file Challenges.hs. Your tests should

also be submitted as a plain text file Tests.hs. Finally, your report should be submitted as a PDF file,

Report.pdf.

The marking scheme is given in the appendix below. There are up to 5 marks for your solution to

each of the programming challenges, up to 5 for your explanation of how you implemented and

tested these, and up to 5 for your coding style. This gives a maximum of 40 marks for this

assignment, which is worth 40% of the module.

Your solutions to these challenges will be subject to automated testing so it is important that you

adhere to the type definitions and type signatures given in the supplied dummy code file

Challenges.hs. Do not change the list of functions and types exported by this file. Your code will be

run using a command line such as ghc  Ce   main   CW2TestSuite.hs, where CW2TestSuite.hs is my test

harness that imports Challenge.hs. You should check before you submit that your solution compiles

and runs as expected.

The supplied Parsing.hs file will be present so it is safe to import this and any library included in the

standard Haskell distribution (Version 8.10.7). Third party libraries will not be present so do not

import these. We will not compile and execute your Tests.hs file when marking.

Appendix: Marking Scheme

Guidance on Coding Style and Readability

Grade Functional Correctness Readability and Coding Style Development & Testing

請加QQ:99515681 或郵箱:99515681@qq.com   WX:codehelp

掃一掃在手機打開當前頁
  • 上一篇:代做CE 314、代寫Python/Java編程
  • 下一篇:ENG5298代做、代寫R程序語言
  • 無相關信息
    合肥生活資訊

    合肥圖文信息
    流體仿真外包多少錢_專業CFD分析代做_友商科技CAE仿真
    流體仿真外包多少錢_專業CFD分析代做_友商科
    CAE仿真分析代做公司 CFD流體仿真服務 管路流場仿真外包
    CAE仿真分析代做公司 CFD流體仿真服務 管路
    流體CFD仿真分析_代做咨詢服務_Fluent 仿真技術服務
    流體CFD仿真分析_代做咨詢服務_Fluent 仿真
    結構仿真分析服務_CAE代做咨詢外包_剛強度疲勞振動
    結構仿真分析服務_CAE代做咨詢外包_剛強度疲
    流體cfd仿真分析服務 7類仿真分析代做服務40個行業
    流體cfd仿真分析服務 7類仿真分析代做服務4
    超全面的拼多多電商運營技巧,多多開團助手,多多出評軟件徽y1698861
    超全面的拼多多電商運營技巧,多多開團助手
    CAE有限元仿真分析團隊,2026仿真代做咨詢服務平臺
    CAE有限元仿真分析團隊,2026仿真代做咨詢服
    釘釘簽到打卡位置修改神器,2026怎么修改定位在范圍內
    釘釘簽到打卡位置修改神器,2026怎么修改定
  • 短信驗證碼 寵物飼養 十大衛浴品牌排行 suno 豆包網頁版入口 wps 目錄網 排行網

    關于我們 | 打賞支持 | 廣告服務 | 聯系我們 | 網站地圖 | 免責聲明 | 幫助中心 | 友情鏈接 |

    Copyright © 2025 hfw.cc Inc. All Rights Reserved. 合肥網 版權所有
    ICP備06013414號-3 公安備 42010502001045

    国产人妻人伦精品_欧美一区二区三区图_亚洲欧洲久久_日韩美女av在线免费观看
    久久久久久久久国产| 不卡av日日日| 色妞欧美日韩在线| 激情五月亚洲色图| 国模吧无码一区二区三区| 天堂v在线视频| 午夜精品免费视频| 国产中文欧美精品| 一本一生久久a久久精品综合蜜| 欧美精品性视频| 久久91亚洲精品中文字幕奶水| 日韩一区二区三区在线播放| 熟女少妇精品一区二区| 国产成人在线亚洲欧美| 欧美久久久久久久久久久久久 | 精品久久蜜桃| 97精品国产97久久久久久免费| 日韩激情视频| 欧美日韩电影在线观看| 一区二区成人国产精品| 亚洲一区尤物| 日本高清不卡在线| 婷婷精品国产一区二区三区日韩| 午夜精品久久久久久久99黑人| 亚洲欧美日产图| 亚洲综合中文字幕在线观看| 精品乱子伦一区二区三区| 久久成人国产精品| 亚洲视频在线二区| 欧洲中文字幕国产精品| 欧美一区二区影视| 激情婷婷综合网| 青春草国产视频| 女同一区二区| 国产免费高清一区| 97久久伊人激情网| 国产精品丝袜久久久久久高清| 国产精品久久久久免费| 欧美精品在线免费播放| 欧美精品久久久久久久免费观看| 亚洲va男人天堂| 国产一区二区香蕉| 91精品国产自产91精品| 久久久999国产精品| 精品久久蜜桃| 日韩免费在线观看视频| 国产欧亚日韩视频| 国产日韩中文在线| 久久综合狠狠综合久久综青草| 精品国产欧美一区二区三区成人| 综合一区中文字幕| 男女午夜激情视频| 91精品国产高清自在线看超| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 日本最新一区二区三区视频观看| 久久成人在线视频| 男人舔女人下面高潮视频| 色综合老司机第九色激情| 一区二区三视频| 偷拍盗摄高潮叫床对白清晰| 欧美一区二区福利| 精品一区2区三区| 久久天天狠狠| 欧美成人精品在线| 日本久久久网站| 免费不卡av在线| 久久免费视频网| 日韩一区不卡| 99精品国产高清在线观看| 久久精品国产2020观看福利| 国产精品高清免费在线观看| 亚洲va码欧洲m码| 韩日欧美一区二区| 国产a视频免费观看| 免费不卡在线观看av| 欧美一区少妇| 久久久伊人日本| 久久精品国产久精国产一老狼| 国产成人生活片| 动漫一区二区在线| 国产一区高清视频| 日韩中文字幕久久| 日本免费成人网| 国产成人黄色av| 日韩欧美国产综合在线| 精品一区久久久| 蜜臀久久99精品久久久久久宅男 | 一区二区传媒有限公司| 欧美日韩免费观看一区| 久激情内射婷内射蜜桃| 日韩高清专区| 国产不卡av在线免费观看| 涩涩日韩在线| www.欧美精品一二三区| 国产成人精品电影久久久| 免费av一区二区| 韩国视频理论视频久久| 国产精品伦子伦免费视频| 青青草国产精品| 久久在线精品视频| 99久久久精品免费观看国产| 亚洲精品国产suv一区88| aaa级精品久久久国产片| 午夜精品久久久内射近拍高清| 国产黑人绿帽在线第一区| 欧美日韩一区二区视频在线观看 | 国产精品日日做人人爱| 国产主播一区二区三区四区| 国产精品免费看久久久香蕉| 国产原创中文在线观看| 日韩在线xxx| 欧美激情网站在线观看| 久久成人免费观看| 国产免费一区二区三区四在线播放| 日韩一级片一区二区| 国产精品网址在线| 91久久国产自产拍夜夜嗨| 日韩国产精品毛片| 九色成人免费视频| 久久精品国产亚洲精品2020| 国产精品一区二区三区毛片淫片| 亚洲最大成人网色| 久久精品国产99精品国产亚洲性色| 亚洲综合av影视| 久久久91精品国产一区不卡| …久久精品99久久香蕉国产| 国产伦精品一区二区三区视频免费 | 欧美日韩一级在线| 不用播放器成人网| 插插插亚洲综合网| 久热国产精品视频| 日韩亚洲欧美中文在线| 日韩有码在线播放| 久久久久久久久久av| 色妞色视频一区二区三区四区| 国产二区视频在线播放| 久久人人九九| 91精品视频网站| 91精品久久久久久蜜桃 | 国产伦精品免费视频| 国产一区二区三区av在线| 日韩欧美三级一区二区| 亚洲最新在线| 日韩男女性生活视频| 久久本道综合色狠狠五月| 日本一区视频在线观看| 久久久久久久999| av天堂永久资源网| 97久久精品人搡人人玩| 欧美日韩dvd| 日韩精品视频一区二区在线观看| 国产精品美女黄网| www.日韩欧美| 久久国产乱子伦免费精品| 国产色一区二区三区| 久久亚洲欧美日韩精品专区| 人妻少妇精品无码专区二区| 国产精品av免费观看| 国产精品久久久久不卡| 欧美亚洲精品日韩| www.国产精品一二区| 欧美福利精品| 国产精品美女呻吟| 国产欧美一区二区三区久久| 亚洲色图自拍| 欧美精品无码一区二区三区| 国产精品视频中文字幕91| 91精品国产精品| 精品人妻少妇一区二区| 日韩免费在线播放| 黄色小网站91| 免费毛片一区二区三区久久久| 欧美性受xxxx黑人猛交| 激情小说综合区| 国产免费一区二区三区在线能观看 | 欧美 日韩精品| 国产日韩在线播放| 日韩中文字在线| 青青草视频国产| 国产精品一区二区3区| 国产成人在线一区| 国产精品高清在线| 欧美一级片免费观看| 国产欧美日韩精品丝袜高跟鞋| 国产精品亚洲网站| 久久久久久欧美| 亚洲一区二区三区香蕉| 精品欧美国产| 色av中文字幕一区| 欧美一区二区三区四区在线 | 青青在线免费观看视频| 国产精品丝袜视频| 欧美激情国产日韩| 日韩精品一区二区三区四| 国产精品海角社区在线观看| 成人国产精品一区二区| 国产国产精品人在线视| 国产高清视频一区三区| 国产伦精品一区二区三区高清版| 国产欧美精品一区二区|