BME Villamosmérnöki és Informatikai Kar
Mérnök-informatikus alapszak
Nappali tagozat
2010/2011-es tanév, őszi félév

Deklaratív programozás

2. kis házi feladat

1.1 változat
Utolsó módosítás: 2010-10-02
Kiadás: 2010-10-04
Beadási határidő: Prolog 2010-11-02, 24:00; Erlang 2010-11-08, 24:00

A feladat

A feladat egy egyszerűsített Mastermind játék megoldása. Kérjük, először olvassa el a jelen félév nagy házi feladatát, mivel ez a kis házi feladat kapcsolódik hozzá.

Írjon tipp_kod néven olyan Erlang-függvényt, ill. Prolog-eljárást, amely egy tipp és a hozzá tartozó válasz alapján megadja az ezekre illeszkedő titkos kódokat! A nagy házi feladattal ellentétben a válasz itt egyetlen szám, a tippre adott összes (fehér és fekete) válaszpálcika száma.

A feladat bemenetei:

Az Erlang-függvény, ill. Prolog-eljárás állítsa elő az összes olyan K kódot, amely a bemenő adatokra illeszkedik, azaz

  1. a K kódlista hossza megegyezik az T tipplista hosszával;
  2. a K lista csak az 1..Max egész számokat tartalmazza;
  3. a K kód esetén a T tippre a Mastermind szabályai szerint adott összes válaszpálcika száma S.

Az Erlang-függvény eredménye az összes illeszkedő kód ismétlődésmentes listája, tetszőleges sorrendben. A Prolog-eljárás kimenete egyetlen kód, azonban visszalépések során az összes illeszkedő kódot elő kell állítania, mégpedig mindegyiket pontosan egyszer; a felsorolás sorrendje itt is érdektelen. Értelemszerűen, ha nincs illeszkedő kód, akkor az Erlang-függvény üres listával tér vissza, a Prolog-eljárás pedig meghiúsul.

A teljesség kedvéért a feladatot a fentitől eltérő módon, a Mastermind játéktől függetlenül is leírjuk. Ehhez felhasználjuk az 1. kis házi feladatban is ismertett zsák (multihalmaz) fogalmát, valamint a zsákokon értelmezett metszet műveletet. Az A és B zsákok metszete az a zsák, amely A és B közös elemeit tartalmazza, és amelyben egy elem multiplicitása az adott elem A és B-beli multiplicitása közül a kisebbik. Egy zsák elemszáma értelemszerűen az elemei multiplicitásának az összege.

A zsák fogalmának felhasználásával a Max és (T,S) bemenő adatokra vonatkozó 3. illeszkedési feltételt a következőképpen írhatjuk le:

  1. a zsáknak tekintett T és K listák metszetének elemszáma S.

Prolog-specifikációk

Írjon Prolog-eljárást tipp_kod/3 néven egy adott Max paraméterre és egy Tipp-S párra illeszkedő kódok előállítására.
% :- type code          == list(int).
% :- type simple_hint ---> code-int.

% :- pred tipp_kod(int::in, simple_hint::in, code::out).
% tipp_kod(Max, Tipp-S, Kod): Kod a Max paraméterre és a Tipp-S párra illeszkedik.

Erlang-specifikációk

Írjon Erlang-függvényt tipp_kod/2 néven egy adott Max paraméterre és egy {Tipp,S} párra illeszkedő kódok előállítására.
%% @type code()          = [integer()].
%% @type simple_hint()   = {code(),integer()}.

%% @spec khf2:tipp_kod(Max::int(),Tipp_S::simple_hint()) -> Kodok::[code()].
%% @doc  A Max maximális kódértékre és a Tipp_S párra illeszkedő kódok listája Kodok.
A programot tartalmazó modul attribútumai ezek legyenek:
-module(khf2).
-author(email@unit.org.hu).
-vsn('year-mm-dd').
-export([tipp_kod/2]).
%-compile(export_all).

Példák

Prolog

| ?- tipp_kod(3, [1,2]-0, K).
K = [3,3] ? ;
no
| ?- tipp_kod(4, [1,2]-0, K).
K = [3,3] ? ;
K = [3,4] ? ;
K = [4,3] ? ;
K = [4,4] ? ;
no
| ?- tipp_kod(2, [1,2]-0, K).
no
| ?- tipp_kod(3, [1,2]-1, K).
K = [1,1] ? ;
K = [1,3] ? ;
K = [2,2] ? ;
K = [2,3] ? ;
K = [3,1] ? ;
K = [3,2] ? ;
no
| ?- tipp_kod(3, [1,2]-2, K).
K = [1,2] ? ;
K = [2,1] ? ;
no
| ?- tipp_kod(2, [1,2,2]-2, K).
K = [1,1,2] ? ;
K = [1,2,1] ? ;
K = [2,1,1] ? ;
K = [2,2,2] ? ;
no

Erlang

1> khf2:tipp_kod(3, {[1,2],0}).
[[3,3]]
2> khf2:tipp_kod(4, {[1,2],0}).
[[3,3],[3,4],[4,3],[4,4]]
3> khf2:tipp_kod(2, {[1,2],0}).
[]
4> khf2:tipp_kod(3, {[1,2],1}).
[[1,1],[1,3],[2,2],[2,3],[3,1],[3,2]]
5> khf2:tipp_kod(3, {[1,2],2}).
[[1,2],[2,1]]
6> khf2:tipp_kod(2, {[1,2,2],2}).
[[1,1,2],[1,2,1],[2,1,1],[2,2,2]]

Tudnivalók a beadásról

A programot az Elektronikus Tanársegéddel kell beadni (l. HF beadás menüpont).

A vizsgaosztályzat megállapításakor a határidőre beadott, helyesen megoldott kis házi feladatokért plusz 1-1 pont jár.


dp@inf.bme.hu