Следующая запись может прояснит:
32 ?- Term = (3*_X + 5*_Y = 10), functor(Term,F,A).
Term = 3*_G527+5*_G530=10
F = =
A = 2
33 ?- Term = (3*_X + 5*_Y = 10), arg(Arg,Term,Val).
Term = 3*_G459+5*_G462=10
Arg = 1
Val = 3*_G459+5*_G462 ; % user pressed ';' interactively
Term = 3*_G459+5*_G462=10
Arg = 2
Val = 10 ; % user pressed ';' interactively
No
35 ?- Term = (3*_X + 5*_Y = 10), arg(1,Term,Val1), functor(Val1,F1,A1),
arg(2,Val1,Val12).
Term = 3*_G693+5*_G696=10
Val1 = 3*_G693+5*_G696
F1 = +
A1 = 2
Val12 = 5*_G696
Последний запрос гласит: для Term
как данность, первый arg
из Term
является Val1
, функтор Val1
является F1
с арностью A1
(а значит, он имеет A1
args - subparts - сам), а второй arg
срока в Val1
хранится под именем Val12
. Чтобы уточнить, любые символические данные в Prolog находятся в форме fff(aa,bb,cc,...)
, где fff
- это какое-то имя, называемое functor, и к «аргументам» в этом выражении можно получить доступ через вызов arg
.
Это означает, что исходное выражение (3*_X + 5*_Y = 10)
фактически хранится в Prolog как '='('+'('*'(3,_X), '*'(5,_Y)), 10)
. Когда вы дойдете до атомных частей (функторы с арностью 0), вы можете проверить их дальше:
47 ?- arg(1,(3*X),V), functor(V,F,A), number(V).
X = _G441
V = 3
F = 3
A = 0
Yes
EDIT: ответить на ваш другой вопрос (с комментариями):
1 ?- (3*_X + 5*_Y = 10) = (A*X + B*Y = C).
A = 3
X = _G412
B = 5
Y = _G415
C = 10
Yes
Если вы настаиваете на том, чтобы не выписывать знак умножения *
явно, вам придется представлять свои термины в виде строк и анализировать эту строку. Это будет гораздо более сложная задача.
EDIT: еще одна вещь, чтобы попытаться это =..
предикат, называется "Унив":
4 ?- (3*_X + 5*_Y = 10) =.. X.
X = [=, 3*_G454+5*_G457, 10]
Yes
5 ?- (3*_X + 5*_Y = 10) =.. X, X=[X1,X2,X3], X2 =.. Y.
X = [=, 3*_G545+5*_G548, 10]
X1 = =
X2 = 3*_G545+5*_G548
X3 = 10
Y = [+, 3*_G545, 5*_G548]
Yes
Какую реализацию пролога вы используете? кажется, что в swi-prolog вы не можете иметь аргумент формы, которую вы описали (3X + 5Y = 10) –
Я искал пролог eclipse, но все должно быть хорошо, мне просто нужно правильно понять понятия. – kallakafar