Labo IDP In dit labo gaan we IDP gebruiken voor het analyseren van logische circuits. K L A XOR N B XOR P M D AND Q AND C O OR E R R Tuesday 15 December 2009 Figuur 1: Een logisch circuit. Veronderstel dat we het logisch circuit uit Figuur 1 beschrijven met volgende Data-blok: Data: Gate = { A; B; C; D; E } Wire = { K; L; M; N; O; P; Q; R } Output = { A -> N; B -> P; C -> O; D -> Q; E -> R } FirstInput = { A -> K; B -> N; C -> L; D -> M; E -> Q } SecondInput = { A -> L; B -> M; C -> K; D -> N; E -> O } Xor = { A; B} And = { C; D } Or = { E } On = { K; M; N; Q; R } Je kan dit downloaden van op: http://telescript.denayer.wenk.be/ jve/circuit.idp 1
Schrijf het bijhorende Given-blok. Test al eens uit of IDP dit als invoer aanvaart. Voeg dan een Satisfying-blok toe, waarin je beschrijft hoe de tweede invoerlijnen van, respectievelijk, een And-, Xor-, of Or-poort zich verhouden tot de bijhorende uitvoerlijn. Om je op weg te helpen, is hier alvast de beschrijving van een And-poort:!x: And(x) => ( On(FirstInput(x)) & On(SecondInput(x)) <=> On(Output(x)) ). Als je de beschrijving van de andere soorten poorten ook hebt toegevoegd, kan je nu controleren of de beschreven waardes voor de draden van het circuit inderdaad mogelijk zijn. Sla je bestand op als circuit1.idp. 1 Oefening 2 We kunnen IDP ook gebruiken om gegeven de waarden van de invoerlijnen van het hele circuit (K, L en M, in dit geval), de waarde van de andere lijnen te berekenen. Om dit voor elkaar te krijgen, hebben we in de eerste plaats een relatie Input nodig, die aangeeft welke de invoerlijnen precies zijn. Voeg deze toe aan het Given- en het Data-blok. We zouden nu de waarde van de invoerlijnen in het Given-blok moeten zetten, en de waarde van de andere lijnen in het Find-blok. Er is hierbij natuurlijk een probleem: we hebben enkel maar een relatie On die de waarde van alle lijnen beschijft. We kunnen nu wel kiezen of we deze relatie bij Given of bij Find zetten, maar gelijk wat we doen, dit zal nooit helemaal juist zijn, aangezien altijd ofwel de waarde van de invoerlijnen ofwel de waarde van de andere lijnen verkeerd zal staan. Los dit probleem op door het introduceren van een nieuwe relatie InputW ireon, die de toestand van de invoerlijnen van het circuit weergeeft. Wat moet er nu gebeuren met de relatie On die we al hadden? Vanzelfsprekend moet er nog een verband zijn tussen InputW ireon en On: met name, elke draad die een invoerlijn is, mag enkel maar On zijn als hij ook InputW ireon is, en omgekeerd. Druk dit uit in je bestand. Gebruik het resulterende bestand om te berekenen wat de waarde van de andere lijnen zal zijn als enkel de invoerlijnen K en M aan staan (maw. L staat uit). Als alles goed is, zou dit natuurlijk hetzelfde resultaat moeten opleveren als in de vorige oefening. Probeer nu eens te berekenen wat het resultaat zal zijn als enkel L aan staat en ga na dat je effectief het juiste resultaat krijgt. Sla je bestand op als circuit2.idp. 2
2 Oefening 3 In deze oefening gaan we eens kijken naar het probleem van diagnose: om te controleren of het circuit wel correct werkt, voeren we een aantal meetingen uit. Om te beginnen beschouwen we een heel eenvoudig geval, waarbij we een bepaalde invoer aan het circuit geven en dan de toestand van een aantal lijnen meten, met de bedoeling om na te gaan of deze toestand overeenkomt met onze verwachtingen. Hiervoor vertrek je van je bestand uit de vorige opgave, en voeg je hieraan een relatie ObservedOn (de lijnen waarvan er geobserveerd is dat ze aan staan) en een relatie ObservedOf f (de lijnen waarvan er geobserveerd is dat ze uit staan) toe aan het Given-blok. Druk in het Satisfying-blok uit dat de geobserveerde waardes overeenkomen met de waardes die de geobserveerde lijnen zouden moeten hebben. Gebruik nu IDP om na te gaan of het circuit correct werkt als we volgende observaties maken: Invoer: K en L staat aan; M staat uit. Observaties: we observeren dat N uit staat en dat O aan staat. Doe daarna hetzelfde voor een tweede verzameling van observaties: Invoer: K en M staat aan; L staat uit. Observaties: we observeren dat Q uit staat en dat N aan staat. Sla je bestand op als circuit3.idp. 3 Oefening 4 We gaan nu het diagnose probleem iets complexer maken. In plaats van enkel te bepalen of het hele circuit al dan niet goed werkt, willen we nu ook weten welke componenten er mogelijk defect zijn. Voeg een relatie Broken toe aan het Find-blok. In de eerste oefening over deze logische circuits heb je in het Satisfying-blok gedefinieerd wat de waarde van de uitvoerlijn van een poort zou moeten zijn in functie van zijn invoerlijnen. In deze oefening gaan we dit veranderen, en in plaats daarvan bijvoorbeeld zeggen dat: Voor elke And-poort die niet defect is, moet het zo zijn dat zijn uitvoerlijn aan staat als en slechts als zijn twee invoerlijnen aan staan. Pas je formule op deze manier aan en doe hetzelfde met de formules voor Oren Xor-poorten. Neem nu opnieuw de tweede verzameling observaties uit de vorige opgave, dwz.: Invoer: K en M staat aan; L staat uit. 3
Observaties: we observeren dat Q uit staat en dat N aan staat. en kijk wat voor uitvoer IDP produceert. Laat IDP ook eens zoeken naar alle mogelijke oplossingen. Je ziet dat IDP heel veel verschillende diagnoses vindt. Dit is ook logisch, aangezien een defecte component eender welke waarde voor zijn uitvoerlijn kan produceren, en we dus nooit zeker kunnen zijn dat een component niet defect is. Hoewel het resultaat van IDP dus in principe correct is, is het natuurlijk niet zo nuttig. Wat we liever zouden hebben, is dat IDP enkel maar minimale diagnoses zoekt, dwz. dat we enkel maar gaan veronderstellen dat een component defect is, als we effectief observaties hebben die betekenen dat hij niet correct kán werken. Voeg hiervoor de volgende formule toe het Satisfying-blok: Subsetminimize: { x : Broken(x) } Het effect van deze uitdrukking zal zijn dat IDP niet meer alle oplossingen rapporteert, maar enkel nog maar die oplossingen waarin de verzameling {x : Broken(x)} van defecte poorten minimaal is. Met andere woorden, moest er een elementje minder in deze verzameling zitten, dan zou de oplossing geen oplossing meer zijn. Bestudeer het effect van deze uitdrukking op de uitvoer van IDP -n0 en overtuig jezelf ervan dat dit resultaat nu inderdaad veel nuttiger is dan het vorige. Kijk ook eens naar de eerste verzameling van observaties uit de vorige opgave: Invoer: K en L staat aan; M staat uit. Observaties: we observeren dat N uit staat en dat O aan staat. Vergelijk de uitvoer die je krijgt mét de Subsetminimize-uitdrukking met de uitvoer die je krijgt zonder. Begrijp je waarom dit zo is? Sla je bestand op als circuit4.idp. 4 Oefening 5 In de vorige oefening hebben we telkens geprobeerd om een diagnose te stellen aan de hand van één reeks van observaties voor dezelfde invoer. We kunnen natuurlijk ook trachten om meerdere testen uit te voeren en al deze informatie samen te gebruiken om tot een diagnose te komen. Bijvoorbeeld: Test 1 Test 2 Invoer: K aan, L en M uit Observaties: P en R staan aan 4
Test 3 Invoer: L aan, K en M uit Observaties: P en R staan aan Invoer: M aan, K en L uit Observaties: P staat aan en R staat uit Hiervoor zal je een type T est moeten toevoegen, met als elementen: Test = { 1; 2; 3 } Een aantal relaties zullen dan een bijkomend argument van type T est krijgen. Zoek de minimale diagnoses van het circuit, gegeven de drie bovenstaande tests. Hierbij wordt er natuurlijk verondersteld dat de status van een bepaalde poort (dwz. defect of niet defect) dezelfde blijft gedurende al de testen. 5