Prolog编译器由于运算符表达而导致语法错误

时间:2018-12-30 20:47:12

标签: prolog

使用Sicstus并给出列表

finditer()

我想将其转换为:

[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 :(得分:1)

这实际上是优先级冲突:对于解释器,尚不清楚应如何将H = A > B读为H = (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).

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

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