Это простая мини-программа, которую я здесь, которая упрощает добавление выражений, которые запрашиваются. Я не могу понять, как закончить это. Когда я запрашиваю следующее:Упрощение в Prolog
sim(sum(sum(x,1),5),Val,[x:X]).
Мой результат Val = X+1+5
. Я бы хотел, чтобы это упростило весь путь до X+6
.
Вот код:
sim(Var, Value, Lst) :- member(Var:Value, Lst).
sim(Num, Num, _) :- number(Num).
sim(sum(Left, Right), Value, Lst) :-
sim(Left, LeftVal, Lst),
sim(Right, RightVal, Lst),
so(Value,LeftVal,RightVal).
so(Result, X, Y) :-
number(X),
number(Y), !,
Result is X + Y.
so(Result, X, Y) :- // debugging so(Result,_,Y) :-
Result = X + Y. // Y value write(Y), Result = Y.
То, что я знаю, что моя программа пытается упростить X+1
перед добавлением X+1
и 5. При изменении последней строки моего метода «так», чтобы только дать Y
В результате я получаю Val = 6
. Перед этой строкой я пишу Y
на экран для целей отладки, и он дает мне 1 5
из-за рекурсии. Что означает, что X
должен быть var? Есть ли угловой случай не здесь, который позволит мне упростить дополнение до конца?
Что я замечаю, так это то, что «so» никогда не добавляет 1 и 5, потому что они никогда не являются аргументами в методе «so», который проверяет, что X и Y являются числами. X и 1 являются первыми аргументами, то при рекурсии X+1
и 5 являются аргументами и это не выполняется, потому что number(X)
терпит неудачу, когда X является X+1
Я думаю, вам может понадобиться более сложный механизм, используя выражения в канонической «нормальной» форме. Вы можете взглянуть на то, как библиотеки CLP реализуют упрощение для вдохновения. Если я правильно напомню, что пакет CLP (R) пакета SWI-proog выполняет в основном то, что вы делаете, но «sim» генерирует выражения в нормальной форме, и «so» объединит два таких выражения в другое выражение в нормальной форме. – vmg
@vmg Да, я просто взглянул на библиотеку CLP, так что вы говорите в этом случае, если «so» имеет аргументы X, будучи X + 1 и Y, будучи 5, я должен поместить их в выражение вместе? – Branbron
Нет, я имею в виду, что вам, возможно, придется определить «внутреннее представление» выражений, которое имеет дело с «переменными» и числами, поэтому вы можете отделить их от других. Если вы хотите только иметь дело с добавлением, представление должно быть простым: просто используйте два списка. Если вы смешиваете и сопоставляете более одного оператора, может потребоваться более сложный подход. – vmg