0

我需要编写序言谓词来读取文件并创建带有重复符号的单词列表。例如来自文本:

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).

它给了我这个错误:

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

在线的:

开读(F,N)

4

1 回答 1

-1

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

第一:第一个谓词将句子分成单词。我使用了内置函数 split_string。示例:“The dog”将变为“The”、“dog”。

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

第二:在第二个谓词中,我们将每个单词分成一个单独的字符列表。示例:“dog”将变为 ["d","o","g"]。

stringsplit(A,L1):-
   atom_chars(A, L1).

第三:然后检查每个列表是否包含双打。当得到空括号时,基本情况谓词告诉停止。checkdouble 第二个谓词检查字符是否在剩余列表中(使用成员)。如果是,则将字符加载到 List 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).

第四:此时您将有许多列表:空的以及包含每个单词重复项的列表。示例:对于 [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
于 2020-11-25T15:24:09.037 回答