Математические операции с атомами в прологе - PullRequest
1 голос
/ 30 ноября 2011

Если у меня есть три атома X, Y и Z, где

X = 1
Y = 2
Z = +

Как собрать их вместе, чтобы X Z Y = 3?

Edit: Используя Univ-решение ThanosQR, я изменил свой код следующим образом:

% Parse list
parse_list([stop|_], _) :- !.   % stop predicate if element is "stop"
parse_list([X, Y|Z]) :- % go through the list line by line
    number(X, Number_1),
    number(Z, Number_2),
    operation(Y, Operation),
    Line =.. [Operation, Number_1, Number_2], 
    Result is Line,
    write(Result).

number(one, 1). 
operation(plus, +). % etc... etc... 

Я ошибаюсь ... Не знаю почему ..

Ответы [ 2 ]

3 голосов
/ 30 ноября 2011

Во-первых, общее замечание: если вы смешиваете нечистые предикаты, такие как 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]) :-
1 голос
/ 30 ноября 2011

попробуйте оператор univ :

R =.. [Z,X,Y], A is R.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...