Prolog 人工智能语言中文论坛---打造优质Prolog学习交流园地

一个供Prolog爱好者学习与交流的地方


您没有登录。 请登录注册

prolog 求助

浏览上一个主题 浏览下一个主题 向下  留言 [第1页/共1页]

1 prolog 求助 于 周日 五月 20, 2012 4:20 pm

新手初学prolog,甚为苦恼,求助论坛各位高手啊
问题如下:
需要从一个txt里读取数据,文件内容是一个商店的商品。包括商品id,商品名称,价格,数量等。例子如下(右边箭头为解释):
1243. ◄id
ritz_crackers. ◄itemName
3. ◄price
125. ◄quantity
29. 7. 2012. ◄expiry date 29/07/2012
end. ◄ end of a record
1247. ◄id
omo_washing_powder. ◄itemName
8. ◄price
120. ◄quantity
end. ◄ end of a record

其中商品有的有保质期有的没有保质期, 每个商品的记录都以end结束。
读取后在prolog里显示为 item (1243, ritz_crackers, 3, 125) 29/07/2012 (如果有保质期的话),并且能都显示全部商品。不知应该如何编写? 跪求指点 谢谢

查阅用户资料

2 回复: prolog 求助 于 周一 五月 21, 2012 1:52 am

sj123 写道::新手初学prolog,甚为苦恼,求助论坛各位高手啊
问题如下:
需要从一个txt里读取数据,文件内容是一个商店的商品。包括商品id,商品名称,价格,数量等。例子如下(右边箭头为解释):
1243. ◄id
ritz_crackers. ◄itemName
3. ◄price
125. ◄quantity
29. 7. 2012. ◄expiry date 29/07/2012
end. ◄ end of a record
1247. ◄id
omo_washing_powder. ◄itemName
8. ◄price
120. ◄quantity
end. ◄ end of a record

其中商品有的有保质期有的没有保质期, 每个商品的记录都以end结束。
读取后在prolog里显示为 item (1243, ritz_crackers, 3, 125) 29/07/2012 (如果有保质期的话),并且能都显示全部商品。不知应该如何编写? 跪求指点 谢谢

1. 保质期是写在item()外面吗?还是作为item的最后一个参数?
2. "并且能都显示全部商品"是指将所有的record都导进prolog里成为很多个item事实是吧?
3. 可以试着用本论坛"扩展工具"里的read_to_list谓词做初步的读入试试。

等你回复了1、2问,我再想想这个怎么写。

查阅用户资料 http://prolog.longluntan.net

3 回复: prolog 求助 于 周一 五月 21, 2012 4:17 am

1.expiry date 是在 item()里面的, 不过并不是所有商品都有保质期。
2.是的,每一个item信息都是以end结束, 然后是下一个item.

查阅用户资料

4 回复: prolog 求助 于 周一 五月 21, 2012 8:52 am

star :- see('record.txt'), toList([],L),write(L),seen.
toList(O,L) :- read(X), (X == end_of_file -> L = O; append(O,[X],T), toList(T,L)).
这样可以将一个txt所有数据读入一个List, 然后再重新structure, 每一个都以end分割开 这样是否可以?

查阅用户资料

5 回复: prolog 求助 于 周一 五月 21, 2012 3:17 pm

sj123 写道::新手初学prolog,甚为苦恼,求助论坛各位高手啊
问题如下:
需要从一个txt里读取数据,文件内容是一个商店的商品。包括商品id,商品名称,价格,数量等。例子如下(右边箭头为解释):
1243. ◄id
ritz_crackers. ◄itemName
3. ◄price
125. ◄quantity
29. 7. 2012. ◄expiry date 29/07/2012
end. ◄ end of a record
1247. ◄id
omo_washing_powder. ◄itemName
8. ◄price
120. ◄quantity
end. ◄ end of a record

其中商品有的有保质期有的没有保质期, 每个商品的记录都以end结束。
读取后在prolog里显示为 item (1243, ritz_crackers, 3, 125) 29/07/2012 (如果有保质期的话),并且能都显示全部商品。不知应该如何编写? 跪求指点 谢谢

我写的这个是假设item的特征只有你说的4或5个(Id、Name、Price、Quantity、Expiry Date),
如果特征个数不定的话就要再修改代码:

代码:
:- dynamic item/4, item/5.

import_data(FilePath) :-
  read_file_to_terms(FilePath, List, []), loop(List), listing(item).
 
loop(List) :- read_item_from_file(List, Remain), (Remain = [] -> true ; loop(Remain)).

read_item_from_file -->
  [Id, ItemName, Price, Quantity, End],
  ({End = end -> assertz(item(Id, ItemName, Price, Quantity))};
  [End2, End3, End4], {assertz(item(Id, ItemName, Price, Quantity, End/End2/End3))} ).

5 ?- import_data('D:/prolog/record.txt').
:- dynamic item/4.

item(1247, omo_washing_powder, 8, 120).

:- dynamic item/5.

item(1243, ritz_crackers, 3, 125, 29/7/2012).

true.

查阅用户资料 http://prolog.longluntan.net

浏览上一个主题 浏览下一个主题 返回页首  留言 [第1页/共1页]

您在这个论坛的权限:
不能在这个论坛回复主题