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)]
我的第一个参数将是名称列表[d_edge,f_edge]
我的第二个参数将是顶点列表[a,b,c]
。
我当前的代码生成[(d_edge,a,b),(f_edge,b,c)]
。
每当我尝试将谓词从 (T1,A1,A2)
更新为 T1(,A1,A2)
我收到一条错误消息,指出它不是有效的谓词。
我明白为什么会出现错误。但我找不到解决办法。
最佳答案
首先要做的事情:T1<b>(,</b>A1,A2)
语法错误。
以下是如何使用内置谓词 (=..)/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).
Sample query using SICStus Prolog 4.3.2:
| ?- list2pair([d_edge,f_edge], [a,b,c], Xs).
Xs = [d_edge(a,b),f_edge(b,c)] ? ; % expected result
no
请注意,上述仅“构造”这些复合术语 - 它不确保合适的事实 d_edge/3
, f_edge/3
等等确实存在。
关于Prolog:如何创建谓词列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37694295/