Во-первых, общее замечание: если вы смешиваете нечистые предикаты, такие как write/1
, в другом чистом коде, вы получаете очень сложную для отладки программу. Поэтому сначала попытайтесь определить отношение, к которому вы стремитесь. Может быть, это что-то вроде tokens_meaning(Tokens,Meaning)
, где Tokens
это список токенов, как указано выше, а Meaning
- это какое-то выражение для оценки.
Для выявления одной проблемы достаточно взглянуть на следующий фрагмент:
...
parse_list([X, Y|Z]) :- % go through the list line by line
number(X, Number_1),
number(Z, Number_2),
...
number(one, 1).
Итак, вы ожидаете, что у вас есть термин следующей формы:
[one, Y|one]
То есть Z
должен быть остальной частью списка. Так что либо []
, либо что-то более похожее на [_]
, но не one
.
Но в вашем случае вы ожидаете имя типа one
. Это, конечно, не имеет смысла. Возможно, вы имели в виду:
parse_list([X, Y, Z| Whatever]) :-