首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在prolog中删除rdf文件中的条目

如何在prolog中删除rdf文件中的条目
EN

Stack Overflow用户
提问于 2022-01-17 18:04:08
回答 1查看 49关注 0票数 1

我想用Prolog编写一个程序,其中给用户一个菜单。他们选择添加数据,查看基于姓氏或年龄的现有数据,或/并根据姓氏或年龄删除数据。我不知道如何删除基于年龄或姓氏的条目。这是我写的。有人能告诉我我做错了什么吗?谢谢。

代码语言:javascript
复制
:- use_module(library(semweb/rdf_db)).
:- use_module(library(semweb/rdf_http_plugin)).
:- use_module(library(semweb/turtle)).

:- dynamic id/1.
id(1).

run :- nl,
   write('Option 1: Load new path'),nl,
   write('Option 2: Create new user'),nl,
   write('Option 3: Display data based on Surname'),nl,
   write('Option 4: Display data based on Age'),nl,
   write('Option 5: Delete data based on Surname'),nl,
   write('Option 6: Delete data based on Age'),nl,
   write('Option 7: Exit'),nl, %It saves the program before exiting
   write('Option(1-7): '), read(X), nl,
   ( shouldExit(X)
   ; (option(X), run)
   ; (nl, write('Invalid option.'), nl, run)
   ).

shouldExit(7) :- save.

option(1) :- write('Give path for rdf file'), read(Path), doOpen(Path).
option(2) :- doRead.
option(3) :- write('Surname: '), read(Surname), findS(Surname).
option(4) :- write('Age: '), read(Age), findA(Age). 
option(5) :- write('Surname: '), read(Surname), delS(Surname).
option(6) :- write('Age: '), read(Age), delA(Age).

/*Enter new user*/
doRead :- rdf_register_prefix(foaf,'http://xmlns.com/foaf/0.1/'),
          write('Surname:'), read(Surname),
          write('First Name:'), read(FirstName),
          write('Age:'), read(Age),
          id(N),
          New is N+1,
          retract(id(N)),
          asserta(id(New)),
          atom_concat('foaf:person', N, Person),
          rdf_assert(Person, rdf:type, foaf:'Person'),
          rdf_assert(Person, foaf:surname, literal(Surname)),
          rdf_assert(Person, foaf:firstName, literal(FirstName)),
          rdf_assert(Person, foaf:age, literal(Age)).
/*Display data based on Surname*/           
findS(Surname) :- rdf(X, foaf:surname, literal(Surname)),
                  rdf(X, foaf:firstName, literal(FirstName)),
                  rdf(X, foaf:age, literal(Age)),
                  write('Found '), write(FirstName), write(' '),
                  write(Surname), write(', '), write(Age), nl, fail.

/*Display data based on Age*/
findA(Age) :- rdf(X, foaf:surname, literal(Surname)),
              rdf(X, foaf:firstName, literal(FirstName)),
              rdf(X, foaf:age, literal(Age)),
              write('Found '), write(FirstName), write(' '),
              write(Surname), write(', '), write(Age), nl, fail.

/*Loads the file from the path the user asks ''*/
doOpen(Path) :- rdf_load(Path).

/*Saves the changes before exiting*/
save :- rdf_save(Path, [foaf]).

/*Deletes user based on their surname*/
/*delS(Surname) :- .*/

/*Deletes user based on their age*/
delA(Age) :- rdf(X, foaf:surname, literal(Surname)),
              rdf(X, foaf:firstName, literal(FirstName)),
              rdf(X, foaf:age, literal(Age)),
            retract(rdf(Surname, FirstName, Age)).
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-18 21:02:53

我不知道,所以这是猜测,但你用的是:

代码语言:javascript
复制
retract(rdf(Surname, FirstName, Age)).

这就是Prolog撤回/1,我认为你需要缩回代替。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70745691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档