d_edge(a, b, 5).
e_edge(a, c, 6).
f_edge(b, c, 8).
% I will have a list of rules for the graph point
% from source to destination with weight.
list2pair([T], [A,B], [(T,A,B)]).
list2pair([T1|Tt], [A1,A2|T], Result) :-
list2pair(Tt, [A1|T], R1),
append([(T1,A1,A2)], R1, Result).
我想提出像
这样的结果[d_edge(a,b), f_edge(b,c)]
我的第一个arg将是名字列表[d_edge,f_edge]
我的第二个arg将是顶点列表[a,b,c]
。
我当前的代码生成[(d_edge,a,b),(f_edge,b,c)]
。
每当我尝试将谓词从(T1,A1,A2)
更新为T1(,A1,A2)
时
我得到一个错误,说它不是有效的谓词。
我理解为什么我收到错误。但我无法找到解决办法。
答案 0 :(得分:3)
第一件事:| ?- list2pair([d_edge,f_edge], [a,b,c], Xs).
Xs = [d_edge(a,b),f_edge(b,c)] ? ; % expected result
no
在语法上是不正确的。
以下是您可以继续使用内置谓词 (=..)/2
(a.k.a. "univ"):
list2pair([T], [A1,A2], [X]) :- X =.. [T,A1,A2]. list2pair([T1|Tt], [A1,A2|T], [X|Xs]) :- X =.. [T1,A1,A2], list2pair(Tt, [A2|T], Xs).
使用SICStus Prolog 4.3.2的示例查询:
d_edge/3
请注意,以上仅“构建”这些复合词 - 它确实不确保合适的事实f_edge/3
,budget_item
等确实存在。