2014-11-18 3 views
1

Это простая мини-программа, которую я здесь, которая упрощает добавление выражений, которые запрашиваются. Я не могу понять, как закончить это. Когда я запрашиваю следующее:Упрощение в 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

+0

Я думаю, вам может понадобиться более сложный механизм, используя выражения в канонической «нормальной» форме. Вы можете взглянуть на то, как библиотеки CLP реализуют упрощение для вдохновения. Если я правильно напомню, что пакет CLP (R) пакета SWI-proog выполняет в основном то, что вы делаете, но «sim» генерирует выражения в нормальной форме, и «so» объединит два таких выражения в другое выражение в нормальной форме. – vmg

+0

@vmg Да, я просто взглянул на библиотеку CLP, так что вы говорите в этом случае, если «so» имеет аргументы X, будучи X + 1 и Y, будучи 5, я должен поместить их в выражение вместе? – Branbron

+0

Нет, я имею в виду, что вам, возможно, придется определить «внутреннее представление» выражений, которое имеет дело с «переменными» и числами, поэтому вы можете отделить их от других. Если вы хотите только иметь дело с добавлением, представление должно быть простым: просто используйте два списка. Если вы смешиваете и сопоставляете более одного оператора, может потребоваться более сложный подход. – vmg

ответ

0

Расширение на мой комментарий выше: here это пример выражения Simplifier, отделяющей «символы» из «значений», используя два списка.

Обратите внимание на то, как он использует тот факт, что при разборе и разглашении единственного оператора, соединяющего символы и значения, является +.

+0

Я вижу, я попытаюсь использовать то, что происходит в этом решении, чтобы, надеюсь, получить мое решение и посмотреть, что я придумал. – Branbron

Смежные вопросы