prolog - sintaxis - declaración dividida en truthable
prolog tutorial (1)
Así que hice un programa Prolog que toma cualquier cantidad de parámetros como ABC y una declaración e imprime su tabla de verdad.
¿Qué pasa si quiero dividir cada declaración solo y mostrar también su tabla de verdad?
ejemplo y (o (A, B), y (A, B)).
por lo que debería mostrar
A B or(A,B) and(A,B) full equation
T T T T T
T F T F T
Me di cuenta del método split_string pero no sé cómo usarlo en mi caso aquí está mi código:
table(VarList,Expr) :- bindList(VarList), do(VarList,Expr), fail.
bind(true).
bind(false).
bindList([]).
bindList([V|Vs]) :- bind(V),bindList(Vs).
do(VarList,Expr) :- writeVarList(VarList), writeExpr(Expr), nl.
writeVarList([]).
writeVarList([V|Vs]) :- write(V), write('' ''), writeVarList(Vs).
writeExpr(Expr) :- Expr, !, write(true).
writeExpr(_) :- write(false).
Si desea poder evaluar subexpresiones por separado, necesita escribir código para calcular esas subexpresiones. Hay una manera fácil de hacerlo con retroceso, aunque aquí una lista parece más apropiada. Aquí hay un DCG que calcula todas and
/ or
subexpresiones, pero deja fuera la variable deja:
subexprs(V) -->
{ var(V), ! },
[].
subexprs(and(L, R)) -->
subexprs(L),
subexprs(R),
[and(L, R)].
subexprs(or(L, R)) -->
subexprs(L),
subexprs(R),
[or(L, R)].
Con esta lista en la mano, puede vincular las variables y evaluar las subexpresiones una por una usando maplist/2
, si su Prolog lo tiene:
?- phrase(subexprs(and(or(A, B), and(A, B))), Subexprs), bindlist([A,B]), maplist(write_expr, Subexprs), nl.
true true true
A = B, B = true,
Subexprs = [or(true, true), and(true, true), and(or(true, true), and(true, true))] ;
true false false
A = true,
B = false,
Subexprs = [or(true, false), and(true, false), and(or(true, false), and(true, false))] ;
true false false
A = false,
B = true,
Subexprs = [or(false, true), and(false, true), and(or(false, true), and(false, true))] ;
false false false
A = B, B = false,
Subexprs = [or(false, false), and(false, false), and(or(false, false), and(false, false))].
Tenga en cuenta que la salida que utiliza write
viene antes de las sustituciones de respuesta. Sería más claro separar la evaluación de expresiones de la impresión de los resultados, usando un predicado como este:
expr_value(Expr, true) :-
call(Expr),
!.
expr_value(_Expr, false).
Esto da:
?- phrase(subexprs(and(or(A, B), and(A, B))), Subexprs), bindlist([A,B]), maplist(expr_value, Subexprs, Values).
A = B, B = true,
Subexprs = [or(true, true), and(true, true), and(or(true, true), and(true, true))],
Values = [true, true, true] ;
A = true,
B = false,
Subexprs = [or(true, false), and(true, false), and(or(true, false), and(true, false))],
Values = [true, false, false] ;
A = false,
B = true,
Subexprs = [or(false, true), and(false, true), and(or(false, true), and(false, true))],
Values = [true, false, false] ;
A = B, B = false,
Subexprs = [or(false, false), and(false, false), and(or(false, false), and(false, false))],
Values = [false, false, false].
A continuación, puede utilizar la lista de Values
para imprimir los valores de las subexpresiones de la misma manera que imprime los valores de las variables.