Поместите информацию из листа в список - PullRequest
0 голосов
/ 04 сентября 2011

Я хочу написать программу, которая помещает информацию из листьев в дерево в список. Я пытался сделать это:

leaves(l(_), [_]). 
leaves(b(B1, B2), [L]):- leaves(B1, [L1]), leaves(B2, [L2]). append(L1, L2, L). 

Но это дает мне L=[_A]. Почему это так?

Ответы [ 3 ]

2 голосов
/ 04 сентября 2011

Кроме того, при описании списка рассмотрите возможность использования записи DCG:

leaves(l(L))     --> [L].
leaves(b(B1,B2)) --> leaves(B1), leaves(B2).

Использование: ?- phrase(leaves(Tree), Leaves).

2 голосов
/ 04 сентября 2011

В вашем коде несколько ошибок, правильный код выглядит так:

leaves(l(X), [X]).
leaves(b(B1, B2), L):- leaves(B1, L1), leaves(B2, L2), append(L1, L2, L).

Я думаю, что основной проблемой было использование _. Это анонимная переменная, это означает, что «здесь может быть что угодно». И если у вас есть это дважды в одном члене, оба _ являются разными переменными.

Кроме того, у вас есть . до append вместо ,. Мой интерпретатор Пролога (SWI-Prolog) сообщил о двух предупреждениях об одноэлементных переменных, их не следует игнорировать.

0 голосов
/ 04 сентября 2011

отладка вашей программы с помощью trace, которая будет выполнять ваш запрос шаг за шагом, чтобы вы могли понять, почему результат неверен.в основном эта переменная, заданная в виде записей списка, обычно вызывается одноэлементными переменными (объявленными, но не использованными, т.е. созданными), как указано в svick.

...