Prolog:如何创建谓词列表?

时间:2016-06-08 05:55:17

标签: prolog

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)时 我得到一个错误,说它不是有效的谓词。

我理解为什么我收到错误。但我无法找到解决办法。

1 个答案:

答案 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/3budget_item等确实存在。