首页 > 解决方案 > 由于运算符表达式,Prolog 编译器给出语法错误

问题描述

使用 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 , ! ,

这是因为>被保留为比较运算符。

我必须在我的代码中进行哪些更改?

标签: prolog

解决方案


这实际上是一个优先级冲突:对于解释器来说,不清楚它应该如何读取H = A > B、 asH = (A > B)(H = A) > B?

解决方案是明确这一点,并使用括号。您可以将谓词重写为:

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).

或者您可以以更规范的形式执行此操作:

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).

由于这里您似乎没有使用Aor B,我们也可以使用下划线:

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

推荐阅读