Я собираю простой мета-интерпретатор, который выводит шаги доказательства. У меня проблемы с получением шагов доказательства в качестве выходного аргумента. Мой предикат explain1
возвращает подробное доказательство, которое мне хотелось бы, но не в качестве выходного аргумента. Мой предикат explain2
возвращает доказательство в качестве выходного аргумента, но не с уровнем детализации, который мне нужен. Можно ли изменить explain2
так, чтобы он выдавал столько же информации, сколько explain1
? Мне не нужно выводить текст «Объяснение ...» и «Объяснение ...», только фактические объяснения и объяснения.
Игрушечные данные в нижней части программы («если они здоровы и богаты, то счастливы») являются лишь примером, и идея состоит в том, чтобы иметь базу данных с большим количеством фактов о других вещах. Я хочу попытаться создать предикат, который принимает эффект, например, happy(john)
и возвращает объяснение этому. Таким образом, аргумент E
explain
должен быть введен пользователем; таким образом, другой запрос может быть explain(_, smokes(mary), _)
и так далее. Я не могу получить то, что хочу, непосредственно из переменных C
и E
в объяснении, потому что я хочу, чтобы программа выводила шаги в процессе проверки, где C
и E
меняются, например, "богатый и здоровый, такой счастливый; побеждает такой богатый; ИСТИННЫЙ такой богатый; ИСТИННЫЙ такой счастливый" и так далее. То есть вернуть все причинно-следственные связи, которые приводят к эффекту.
На отличном сайте Маркуса Триски есть некоторые подробности об этом, но у меня возникают проблемы с адаптацией этого кода к моей проблеме.
Любая помощь будет принята с благодарностью!
Спасибо / JCR
Моя программа:
main1:-explain1(_, happy(john), _), fail.
main2:-explain2(_, happy(john), _, T), writeln(T), fail.
explain1(C, E, P):-
C = ['True'],
p(C, E, P),
write('Explaining '), write(E),
write('. An explanation is: '), write(C),
write(' with probability '), write(P), nl.
explain1(C, E, P):-
p(C, E, P),
not(C = ['True']),
write('Explaining '), write(E),
write('. An explanation is: '), write(C),
write(' with probability '), write(P), nl.
explain1(C, E, P):-
p(C0, E, P0),
maplist(explain1, C1, C0, P1),
flatten(C1, C),
append([P0], P1, P2),
flatten(P2, P3),
foldl(multiply, P3, 1, P),
write('Explaining '), write(E),
write('. An explanation is: '), write(C),
write(' with probability '), write(P), nl.
explain2(C, E, P, T):-
C = ['True'],
p(C, E, P),
T = [C, E, P].
explain2(C, E, P, T):-
p(C, E, P),
not(C = ['True']),
T = [C, E, P].
explain2(C, E, P, T):-
p(C0, E, P0),
maplist(explain2, C1, C0, P1, _),
flatten(C1, C),
append([P0], P1, P2),
flatten(P2, P3),
foldl(multiply, P3, 1, P),
T = [C, E, P].
multiply(V1, V2, R) :- R is V1 * V2.
p(['True'], wins(john), 0.7).
p([wins(john)], rich(john), 0.3).
p(['True'], healthy(john), 0.9).
p([rich(john), healthy(john)], happy(john), 0.6).
Вывод main1:
Explaining happy(john). An explanation is: [rich(john), healthy(john)] with probability 0.6
Explaining rich(john). An explanation is: [wins(john)] with probability 0.3
Explaining healthy(john). An explanation is: [True] with probability 0.9
Explaining happy(john). An explanation is: [wins(john), True] with probability 0.162
Explaining wins(john). An explanation is: [True] with probability 0.7
Explaining rich(john). An explanation is: [True] with probability 0.21
Explaining healthy(john). An explanation is: [True] with probability 0.9
Explaining happy(john). An explanation is: [True, True] with probability 0.1134
Выход main2:
[[rich(john), healthy(john)], happy(john), 0.6]
[[wins(john), True], happy(john), 0.162]
[[True, True], happy(john), 0.1134]