Prolog:如何创建谓词列表?

标签 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)]

我的第一个参数将是名称列表[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/

相关文章:

prolog - 明确 Prolog 目标的 "deterministic success"

sql - 将 [Head|Tail] 编译为 SQL

qt - 如何使用 QProcess 获得 SWI-prolog 查询的下一个解决方案?

prolog - 如何添加到序言中的列表末尾

Prolog:f(X) = X 是否可以统一?

prolog - 约束逻辑编程调度

list - Prolog - 笛卡尔积计算器

java - Prolog 嵌入 java 帮助中

Prolog 座位限制

ruby - Prolog(嗯,rubylog)中的一个简单的同义词匹配器