<div class="notebook"> <div class="nb-cell program" name="p1"> % An empty list can have any applier. applier([], _). % A list elements must have identical appliers. applier([H|T], A) :- applier(H, A), applier(T, A). % A layout has a uiApplier applier(layout, uiApplier). % A layout with content has a uiApplier and its content must have a uiApplier. applier(layout(C), uiApplier) :- applier(C, uiApplier). % A vector has a vector Applier. applier(vector, vectorApplier). % A vector with content has a vector applier and its content must have a vector applier applier(vector(C), vectorApplier) :- applier(C, vectorApplier). % coreText is a layout applier(coreText, A) :- applier(layout, A). % basicText is coreText applier(basicText, A) :- applier(coreText, A). % text is basic text applier(text, A) :- applier(basicText, A). % circle is a vector applier(circle, A) :- applier(vector, A). % square is a vector applier(square, A) :- applier(vector, A). % provider provides information to its content of for all appliers. applier(provider(C), A) :- applier(C, A). % A row is a layout container applier(row(C), A) :- applier(layout(C), A). % A button is a row applier(button(C), A) :- applier(row(C), A). % A layer is a vector container applier(layer(C), A) :- applier(vector(C), A). % A drawing is a layout that draws a vector applier(drawing(C), A) :- applier(layout, A), applier(vector(C), vectorApplier). % Test programs % text infers as a using a uiApplier program(text). % circle infers as using a vectorApplier program(circle). % Two texts infer as using a uiApplier. program([text, text]). % A row infers as a uiApplier program(row([text, text])). % A provider is generic, it is inferred from its content. program( provider([ row([ text, button([ text ]) ]) ]) ). program( provider([ circle, square ]) ). % Drawing switches it content from uiProider to vectorApplier program( row([ drawing([ circle, square, layer([ circle ]) ]) ]) ). % drawing can contain a provider as it infers vectorApplier program( provider([ row([ drawing([ provider([ circle, square ]) ]) ]) ]) ). % Run the inferences (e.g. ?- infer(P, A).) infer(P, A) :- program(P), applier(P, A). </div> </div>