在prolog中读取城市距离的csv文件?
我有一个像csv这样的文件 现在我想让这个文件在prolog中创建这样的事实在prolog中读取城市距离的csv文件?,prolog,Prolog,我有一个像csv这样的文件 现在我想让这个文件在prolog中创建这样的事实 distance(A,E,3) distance(A,G,5) and so on. 根据我尝试过的其他答案 csv_read_文件(“test.csv”,行,[functor(citylist),arity(5)]),地图列表(断言,行),打印(行) 但这只是返回一行数据。如何将其理解为邻接图?提醒:资本价值实体是逻辑变量,因此您的事实应该使用小写字母a、b、c等 假设您知道节点是什么,一旦将距离输入Prolog
distance(A,E,3)
distance(A,G,5)
and so on.
根据我尝试过的其他答案
csv_read_文件(“test.csv”,行,[functor(citylist),arity(5)]),地图列表(断言,行),打印(行)
但这只是返回一行数据。如何将其理解为邻接图?提醒:资本价值实体是逻辑变量,因此您的事实应该使用小写字母a、b、c等 假设您知道节点是什么,一旦将距离输入Prolog,下面介绍如何查找给定节点的相邻节点:
adjacencies(Node, Adjacencies) :-
findall(Adj, distance(Node, Adj, _), Adjacencies).
因此,对于一些距离事实,如您的插图中所示
?- adjacencies(a, L).
L = [e,g,c,b]
这是否回答了您的问题?假设CSV看起来像:
"Distance","E","G","C","B"
"A","3","5","7","3"
"B","4","5","6","0"
"C","4","1","0","6"
"D","5","8","3","6"
在谈论搜索策略之前,你能定义一下你的目标吗?你要的是一个邻接图,你得到了你要的吗?关于这个话题,stackoverflow已经有几个问题和答案了。找到并阅读它们。如果你对一项(小)任务有特别的问题,那就问吧!让你的家庭作业为你完成,不会帮助你理解Prolog。关于SO的唯一答案是关于逐行阅读csv,我找不到这行、列对csv阅读。关于问题陈述,你要求目标,这就是为什么我提到它,也许是为了给你一些背景。谢谢,它帮助了很多。
:- [library(csv)] .
:- [library(lists)] .
%! distance(CITY_A,CITY_B,DISTANCE)
%
% dynamic facts asserted based upon csv file .
:- dynamic distance/3 .
:- op(1,'xfy','csv_') .
%! csv(FILE0)
%
% read the CSV file `FILE0` and add facts to the database .
csv(FILE0)
:-
(start) csv_ (FILE0)
.
(start) csv_ (FILE0)
:-
csv:csv_read_file(FILE0,[HEADER|ROWss]) ,
row__to__list(HEADER,HEADERs) ,
(loop) csv_ (HEADERs,ROWss)
.
(loop) csv_ (_HEADERs,[])
:-
true
.
(loop) csv_ (HEADERs,[ROW|ROWss])
:-
row__to__list(ROW,ROWs) ,
lists:nth1(1,ROWs,CITY_A) ,
QUERY_A=(lists:nth1(NTH,ROWs,DISTANCE)) ,
QUERY_B=(NTH > 1) ,
QUERY_C=(lists:nth1(NTH,HEADERs,CITY_B)) ,
QUERY=(QUERY_A,QUERY_B,QUERY_C) ,
ASSERT=assertz(distance(CITY_A,CITY_B,DISTANCE)) ,
forall(QUERY,ASSERT) ,
(loop) csv_ (HEADERs,ROWss)
.
row__to__list(ROW,ROWs)
:-
ROW=..[_|ROWs]
.
/*
?- csv('data/distances.csv').
true ;
false.
?- listing(distance).
distance('A', 'E', 3).
distance('A', 'G', 5).
distance('A', 'C', 7).
distance('A', 'B', 3).
distance('B', 'E', 4).
distance('B', 'G', 5).
distance('B', 'C', 6).
distance('B', 'B', 0).
distance('C', 'E', 4).
distance('C', 'G', 1).
distance('C', 'C', 0).
distance('C', 'B', 6).
distance('D', 'E', 5).
distance('D', 'G', 8).
distance('D', 'C', 3).
distance('D', 'B', 6).
?-
*/