prolog v5.2中带重复符号的单词

prolog v5.2中带重复符号的单词,prolog,visual-prolog,Prolog,Visual Prolog,我需要编写prolog谓词来读取文件并创建一个包含重复符号的单词列表。例如,从文本: A dog and an apple and a pipe. 结果应该是: ['apple', 'pipe'] 我写道: domains file_ = f s=string c=char i=integer list=s* list1=c* predicates str_a_list(s,list) readfile(s,s) example(s) write_symbols(list1) searc

我需要编写prolog谓词来读取文件并创建一个包含重复符号的单词列表。例如,从文本:

A dog and an apple and a pipe.
结果应该是:

['apple', 'pipe']
我写道:

domains
file_ = f
s=string
c=char
i=integer
list=s*
list1=c*
 
predicates
str_a_list(s,list)
readfile(s,s)
example(s)
write_symbols(list1)
search(list1,list1,list1)
check(list)
str_list(s,list1)
search1(list1,c,i,i)
 
 
clauses
readfile(S,N):-existfile(N),!,
openread(F,N),  
readdevice(F),file_str(N,S).
 
str_a_list("",_):-!. 
str_a_list(" ",_):-!. 
str_a_list(S,[H|T]):-fronttoken(S,H,S1),
str_a_list(S1,T). 
        
search1([],_,I,I):-!.
search1([H|T],H,I,M):-I1=I+1,search1(T,H,I1,M).
search1([H|T],X,I,M):-H<>X,search1(T,X,I,M).
 
search([],_,_):-!.
search([H|T1],L,L0):-search1(L,H,0,M),M>=2,write_symbols(L0).
search([_|T],L,L0):-search(T,L,L0).
 
write_symbols([]):-write(" "),!.
write_symbols([H|T]):-write(H),write_symbols(T).
 
str_list("",[]).
str_list(S,[H|T]):- frontchar(S,H,S1),str_list(S1,T). 
 
check([]):-!.
check([H|T]):-str_list(H,L),search(L,L,L),check(T).
 
example(Y):-readfile(S,Y),str_a_list(S,L),check(L).
    
goal
write("Enter file name: "),
readln(Y),example(Y).
域
文件=f
s=字符串
c=字符
i=整数
列表=s*
列表1=c*
谓词
str_a_列表(s,列表)
读取文件
例子
写入符号(列表1)
搜索(列表1、列表1、列表1)
检查(列表)
str_列表(s,列表1)
搜索1(列表1,c,i,i)
条款
readfile(S,N):-existfile(N),!,
openread(F,N),
读取设备(F),文件(N,S)。
str_a_列表(“,”)-!。
str_a_列表(“,”)-!。
str|a|u list(S[H|T]):-fronttoken(S,H,S1),
str_a_列表(S1,T)。
搜索1([],[u,I,I):-!。
search1([H | T],H,I,M):-I1=I+1,search1(T,H,I1,M)。
search1([H | T],X,I,M):-HX,search1(T,X,I,M)。
搜索([],[uu],[uu]:-!。
搜索([H | T1],L,L0):-search1(L,H,0,M),M>=2,写符号(L0)。
搜索([|T],L,L0):-搜索(T,L,L0)。
写符号([]):-写(“”,!。
写符号([H | T]):-写(H),写符号(T)。
str_列表(“,[])。
stru列表(S,[H | T]):-frontchar(S,H,S1),stru列表(S1,T)。
检查([]):-!。
检查([H | T]):-str_列表(H,L),搜索(L,L,L),检查(T)。
示例(Y):-readfile(S,Y),str_a_列表(S,L),check(L)。
球门
写入(“输入文件名:”),
readln(Y),示例(Y)。
这给了我一个错误:

此流模式不存在openread(o,i)

在线:


openread(F,N)

我试着计算这个prolog任务,也许你会在我的解决方案中发现一些有用的东西,可以帮助你完成你的任务。我已经使用基本prolog编写了代码:

First:第一个谓语将句子分隔成单词。我使用了内置函数split_string。例如:“dog”将变成“the”,“dog”

Second:在第二个谓词中,我们将每个单词拆分为单独的字符列表。例如:“狗”将变成[“d”、“o”、“g”]

第三:然后检查每个列表是否包含双精度。当获取空括号时,基本大小写谓词告诉停止。checkdouble second谓词检查字符是否在剩余列表中(使用成员)。如果是,则加载列表R中的字符。否则,不要加载列表R中的字符

    checkdouble([],[]):-!.
    checkdouble([H|T],[H|R]):-
    member(H,T),
    checkdouble(T,R).

    checkdouble([],[]).
    checkdouble([H|T],List):-
    \+member(H,T),
    checkdouble(T,List).
Fourth:此时,您将有许多列表:空列表和包含每个单词重复项的列表。例如:对于[bat][apple][polo],我们将得到[p][o]。 现在我们使用一个谓词,它只打印有双精度的单词列表,忽略那些没有双精度的单词,即[]

s(_,B):-
    B=[].
s(D,B):-
    B\=[],
   write(D). 
 
最后:将代码放在一起:

g(B):-
    split_string(B,' ','', L),
    d(L).

d([]).
d([H|T]):-
    stringsplit(H,K),
    checkdouble(K,R),
    s([H],R),
    d(T).
    

s(_,B):-
    B=[].
s(D,B):-
    B\=[],
   write(D). 
    


 checkdouble([],[]):-!.
 checkdouble([H|T],[H|R]):-
 member(H,T),
 checkdouble(T,R).

 checkdouble([],[]).
 checkdouble([H|T],List):-
 \+member(H,T),
 checkdouble(T,List).
                
                
 stringsplit(A,L1):-
 atom_chars(A, L1).
示例:

?-g("A dog and an apple and a pipe").
OUTPUT:    
[apple][pipe]
1true
false

?-g("Two funny little red apples fell from a tree one day").
OUTPUT:
[funny][little][apples][fell][tree]
1true
false

?-g("On a hill upon the grass there sits a squirrel in the chill").
OUTPUT:
[hill][grass][there][sits][squirrel][chill]
1true
false

我基本上否决了这一点,因为您坚持使用
write
,而不是计算Prolog系统将打印的数据(格式正确,而您的程序没有)。但是,您还没有充分理解递归谓词:
checkdouble/2
不应该有两种空列表的情况。一旦找到一个双重元素,它就不会再出现了。如果你否决了我,那没关系,我还在学习prolog。我要花点时间才能理解所有的规则。
g(B):-
    split_string(B,' ','', L),
    d(L).

d([]).
d([H|T]):-
    stringsplit(H,K),
    checkdouble(K,R),
    s([H],R),
    d(T).
    

s(_,B):-
    B=[].
s(D,B):-
    B\=[],
   write(D). 
    


 checkdouble([],[]):-!.
 checkdouble([H|T],[H|R]):-
 member(H,T),
 checkdouble(T,R).

 checkdouble([],[]).
 checkdouble([H|T],List):-
 \+member(H,T),
 checkdouble(T,List).
                
                
 stringsplit(A,L1):-
 atom_chars(A, L1).
?-g("A dog and an apple and a pipe").
OUTPUT:    
[apple][pipe]
1true
false

?-g("Two funny little red apples fell from a tree one day").
OUTPUT:
[funny][little][apples][fell][tree]
1true
false

?-g("On a hill upon the grass there sits a squirrel in the chill").
OUTPUT:
[hill][grass][there][sits][squirrel][chill]
1true
false