prolog - 在prolog中读取城市距离的csv文件?
问题描述
我有一个像 csv 这样的文件
现在我希望这个文件在序言中创建这样的事实
distance(A,E,3)
distance(A,G,5)
and so on.
根据其他答案,我尝试了 csv_read_file("test.csv", Rows, [functor(citydist), arity(5)]), maplist(assert, Rows), print(Rows)。
但这只是返回一行数据。如何将其读取为邻接图?
解决方案
假设 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"
:- [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).
?-
*/
推荐阅读
- css - React onMouseEnter/onMouseLeave 用于悬停在地图中
- aix - IBM AIX 7.1 无法使用 gtk2-2.24.30-2 进行编译
- c++ - 使用 libxml2 解析 XML
- javascript - 从键包含“。”的对象创建 json
- php - 502 Bad Gateway with dockerized PHP-FPM
- laravel - Maatwebsite/Laravel-Excel 在模型中使用 Input::get() 时导出空白 excel
- c - 我正在尝试使用 UDP 套接字将字符串从服务器回显到客户端,但它失败了?
- java - 在表单验证期间值为空时也会显示错误消息
- android - 从子字符串集合管理和构建 URL/字符串(又名构建请求 url)
- spring - Spring 'Sec-WebSocket-Accept' 值不正确