2012-05-30 5 views
1

Довольно новая для Пролога. Я пытаюсь дать два списка, и разница между ними вернулась. Второй список может иметь связанные переменные и несвязанные переменные в нем. Я пробовал отслеживать это, и он повторяется полностью и дает мне правильный список в NewL, но затем на обратном пути он отменяет все удаленные действия, которые я сделал. Что происходит не так? Спасибо за помощь!Пролог: Разница в двух списках

% Find difference between two lists, return result in Difference 
difference(List,[H|T],Difference) :- % When H is unbound var, use Tail 
    var(H),!,difference(List,T,Difference),!. 

difference(List,[H|T],Difference) :- % When H is bound var, remove from List. 
    subtract(List,[H],NewL), 
    difference(NewL,T,Difference),!. 
+3

вставки случайных порезов в предикате, как правило, плохой способ идти о решении ошибок:] – m09

ответ

2

Предполагая, что вычитать/3 происходит от SWI-Prolog library, и, таким образом, является правильным, вы остались с только одна возможность: вы забыли объявить базовый случай на второй аргумент, который приводит в движение рекурсию.

Примите во внимание комментарий от @mog, порезы следует использовать только при необходимости. Конечно, чтобы решить, когда являются обязательно может быть трудно ...

+0

разность (List, [], Difference): - \t Разница - это список. Я пробовал это, но он не работает. Когда отслеживаю, я получаю это. Последние шаги при попытке: разница ([1,2,3,4], [3,4], Dif). ... Звоните: (9) _G541 is [1, 2]? creep ERROR: '.'/2: Ошибка типа: '[] 'ожидается, найдено' [2]' («x» должен содержать один символ) Исключение: (9) _G541 is [1, 2]? Idk, что мне не хватает. Я хочу, чтобы пролог соответствовал Dif результату, который я вычисляю, но вместо этого рекурсия назад и мой вычисленный результат теряются. – user1329182

+0

просто синтаксическая ошибка: * is * оценивает * арифметику *, просто используйте * = *, чтобы унифицировать var – CapelliC

+0

. Это решило, спасибо. Глупая ошибка. Я действительно пробовал это раньше, но оставил его, потому что он не работал. Спасибо chac и mog! – user1329182

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