% FASB SFAC 6, Elements of Financial Statements, in Prolog % % https://www.fasb.org/pdf/con6.pdf % % Created by Charles Hoffman, CPA (charles.hoffman@me.com). % % Public domain: https://creativecommons.org/publicdomain/zero/1.0/ % % Run SWI-Prolog using https://swish.swi-prolog.org/ % term(asset). term(liability). term(equity). term(comprehensiveIncome). term(investmentsByOwners). term(distributionsToOwners). term(revenues). term(expenses). term(gains). term(losses). structure(statementOfFinancialPosition). structure(statementOfIncome). structure(statementOfChangesInEquity). entity(microsoft). period(2017). period(2016). assertion(does_balance_sheet_balance). assertion(does_income_statement_foot). assertion(does_equity_roll_forward). fact(term(asset), entity(microsoft), period(2017), 241086000000). fact(term(liabilities), entity(microsoft), period(2017),168692000000). fact(term(equity), entity(microsoft), period(2017),72394000000). fact(term(equity), entity(microsoft), period(2016),71997000000). fact(term(investmentsByOwners), entity(microsoft), period(2017),0). fact(term(distributionsToOwners), entity(microsoft), period(2017),19701000000). fact(term(revenues), entity(microsoft), period(2017),89950000000). fact(term(expenses), entity(microsoft), period(2017),69569000000). fact(term(gains), entity(microsoft), period(2017),823000000). fact(term(losses), entity(microsoft), period(2017),1106000000). fact(term(comprehensiveIncome), entity(microsoft), period(2017),20098000000). % rule Assets = Liabilities + Equity % does_balance_sheet_balance(Entity, Period) :- fact(term(asset),entity(Entity),period(Period),Asset), fact(term(liabilities),entity(Entity),period(Period),Liabilities), fact(term(equity),entity(Entity),period(Period),Equity), Asset is Liabilities + Equity. % rule ComprehensiveIncome = Revenues - Expenses + Gains - Losses % does_income_statement_foot(Entity, Period) :- fact(term(comprehensiveIncome),entity(Entity),period(Period),ComprehensiveIncome), fact(term(revenues),entity(Entity),period(Period),Revenues), fact(term(expenses),entity(Entity),period(Period),Expenses), fact(term(gains),entity(Entity),period(Period),Gains), fact(term(losses),entity(Entity),period(Period),Losses), ComprehensiveIncome is Revenues - Expenses + Gains - Losses. % rule EndingEquity = BeginningEquity + ComprehensiveIncome + InvestmentsByOwners - DistributionsToOwners % does_equity_roll_forward(Entity, Period) :- fact(term(equity),entity(Entity),period(2016),BeginningEquity), fact(term(comprehensiveIncome),entity(Entity),period(Period),ComprehensiveIncome), fact(term(equity),entity(Entity),period(Period),EndingEquity), fact(term(distributionsToOwners),entity(Entity),period(Period),DistributionsToOwners), EndingEquity is BeginningEquity + ComprehensiveIncome - DistributionsToOwners. % rule EndingEquity = BeginningEquity + ComprehensiveIncome + InvestmentsByOwners - DistributionsToOwners does_equity_roll_forward(Entity, period_range(BeginningPeriod,EndPeriod)) :- fact(term(equity),entity(Entity),period(BeginningPeriod),BeginningEquity), fact(term(comprehensiveIncome),entity(Entity),period(EndPeriod),ComprehensiveIncome), fact(term(equity),entity(Entity),period(EndPeriod),EndingEquity), fact(term(investmentsByOwners),entity(Entity),period(EndPeriod),InvestmentsByOwners), fact(term(distributionsToOwners),entity(Entity),period(EndPeriod),DistributionsToOwners), EndingEquity is BeginningEquity + ComprehensiveIncome + InvestmentsByOwners - DistributionsToOwners. /** ?- fact(Term, Entity, Period, Value). ?- does_balance_sheet_balance(microsoft, 2017). ?- does_income_statement_foot(microsoft, 2017). ?- does_equity_roll_forward(microsoft, period_range(2016, 2017)). ?- does_equity_roll_forward(microsoft, period_range(2015, 2017)). */