prolog - 由于运算符表达式,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 , ! ,
这是因为>
被保留为比较运算符。
我必须在我的代码中进行哪些更改?
解决方案
这实际上是一个优先级冲突:对于解释器来说,不清楚它应该如何读取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).
由于这里您似乎没有使用A
or 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).
推荐阅读
- python - PyQt QFileIconProvider 类自定义图标
- python - 使用 int|abs 时出现 Ansible Jinja 错误
- java - 多租户环境中的 javax.faces.convert.Converter
- php - laravel 5.6 轮播引导程序
- c# - 通过共享选项列表检索共享文本?
- sql-server - Talend Open Studio 是否有类似于 SSIS 的序列容器?
- java - 与 Collection.sort() 相比,使用 stream().sorted() 有什么优势吗?
- allure - Teamcity 中的 Allure 报告构建步骤返回“无法复制历史文件”错误
- database - 使用 TRIGGER 根据另一个表插入更新表行?
- c# - 如何在 C# .Net 中使用 InsertOneAsync 将文档插入 MongoDB 并返回相同的文档或其 ID