Компилятор Prolog выдает синтаксическую ошибку из-за выражения оператора - PullRequest
0 голосов
/ 30 декабря 2018

Используя Sicstus и учитывая список

[b > f, f > c, c > b, g > h, g > g, d, b, f > k, k > f, f > c]

Я хочу преобразовать его в:

graph([b,c,d,f,g,h,k],[e(b,f),e(c,b),e(f,c),e(f,k),e(g,g),e(g,h),e(k,f)])

Моя цель - преобразовать первый список в два отдельных списка только однимпройти через первый и использование двух аккумуляторов.

hf_to_graph_term([H|T], AccN, Nodes, AccE, Edges):-
    H = A>B,!,
    merge([H],AccE,NewAccE),
    hf_to_graph_term(T,AccN,Nodes,NewAccE,Edges).

Однако я получаю сообщение об ошибке:

 ! Syntax error
 ! operator expected after expression
 ! in line 290
 ! hf_to_graph_term ( [ H | T ] , AccN , Nodes , AccE , Edges ) :- H = A 
 ! <<here>>
 ! > B , ! ,

Это потому, что > зарезервирован как оператор сравнения.

Какие изменения я должен внести в мой код?

1 Ответ

0 голосов
/ 30 декабря 2018

Это на самом деле приоритетное столкновение: для интерпретатора непонятно, как он должен читать H = A > B, как H = (A > B) или (H = A) > B?

Решение состоит в том, чтобы сделать это явным,и используйте скобки .Вы можете переписать предикат так:

hf_to_graph_term([H|T], AccN, Nodes, AccE, Edges):-
    H = <b>(A > B)</b>,
    !,
    merge([H],AccE,NewAccE),
    hf_to_graph_term(T,AccN,Nodes,NewAccE,Edges).

или сделать это в более канонической форме:

hf_to_graph_term([H|T], AccN, Nodes, AccE, Edges):-
    H = <b>>(A, B)</b>,
    !,
    merge([H],AccE,NewAccE),
    hf_to_graph_term(T,AccN,Nodes,NewAccE,Edges).

Поскольку здесь вы, похоже, не используете A или B мы также можем использовать подчеркивание:

hf_to_graph_term([H|T], AccN, Nodes, AccE, Edges):-
    H = <b>>(_, _)</b>,
    !,
    merge([H],AccE,NewAccE),
    hf_to_graph_term(T,AccN,Nodes,NewAccE,Edges).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...