【问题标题】:how to print something inside a list without the '[]' and ',' in Prolog如何在Prolog中打印没有'[]'和','的列表中的内容
【发布时间】:2019-05-13 09:14:11
【问题描述】:

当用户输入“saya suka makan pisang”时,预期的输出是“我喜欢吃香蕉”。 但现在我得到的是[我,喜欢,吃,香蕉]。 我该如何解决?

这些是我的事实:

words(saya,i).
words(makan,eat).
words(pisang,banana).
words(suka,like).

translation(X,Y):-
    words(X,Y).
translation(X,Y):-
    words(Y,X).
translation(X,X).

translate([], []).
translate([H|T], [H1|T1]):-
             translation(H, H1),
             translate(T,T1).

prolist([],[]).
prolist(SL,[W|T]):-
    split(SL,WL,R),
    name(W,WL),
    prolist(R,T).

split([],[],[]).
split([32|T],[],T).
split([H|T],[H|T2],R):-
    split(T,T2,R).  

run:-
    nl,write('Enter One sentence or word (English or Malay):'),
    read(X),end(X),
    nl.

end(X):-    
    X=q->write('SESSION END. THANK YOU. ');
    name(X,SL),prolist(SL,List),translate(List,W),
    nl,
    write('Translated as:'),
    write(W),
    nl,
    run.

【问题讨论】:

  • 在 Prolog 中,列表总是有分隔的对象,用 ',' 来通知它的列表,它有 [] 括号。您可以解决它检查swi-prolog.org/pldoc/man?predicate=atomic_list_concat/3 以删除括号。第一个参数是您的列表,第二个是分隔符,最后一个参数是您想要在这种情况下用作输出的 Atom
  • 不是很懂prolog,可以给我写一些代码吗?
  • 你的初始谓词是什么?你在使用translation([saya,suka,makan,pisang],X) 吗?编辑:我明白了,您将它用作运行和结束,最后您通过写入推送它。
  • @A.A.mind 帮我解决这个问题? stackoverflow.com/questions/56112352/…

标签: list prolog


【解决方案1】:

Prolog 中的列表元素总是通过 ',' 分隔,并且为了表明它们是列表,它们用 "​​[List]" 包裹

但是,您可以通过在您的情况下使用将您的列表转换为原子并删除括号和“,”:

atomic_list_concat(List, ' ', W)

List 是您正在使用的列表,' ' 是您想要的分隔符,在这种情况下您不需要任何分隔符,W 是您将为此谓词获得的输出原子。 谓词及其参数是:

atomic_list_concat(+List, +Separator, -Atom)

您所要做的就是将 end(X) 谓词替换为

end(X):-    
X=q->write('SESSION END. THANK YOU. ');
name(X,SL),prolist(SL,List),translate(List,K), atomic_list_concat(K, ' ', W),
nl,
write('Translated as:'),
write(W),
nl,
run.

它会按预期工作

更多查找:http://www.swi-prolog.org/pldoc/man?predicate=atomic_list_concat/3

【讨论】:

【解决方案2】:

在win-Prolog 版本中,您可以将atomic_list_concat(List, ' ', W) 替换为cat/3 谓词,例如:

words(saya,i).
words(makan,eat).
words(pisang,banana).
words(suka,like).

translation(X,Y):-
    words(X,Y).
translation(X,Y):-
    words(Y,X).
translation(X,X).

translate([], []).
translate([H|T], [H1|[' '|T1]]):-
             translation(H, H1),
             translate(T,T1).

prolist([],[]).
prolist(SL,[W|T]):-
    split(SL,WL,R),
    name(W,WL),
    prolist(R,T).

split([],[],[]).
split([32|T],[],T).
split([H|T],[H|T2],R):-
    split(T,T2,R).  

run:-
    nl,write('Enter One sentence or word (English or Malay):'),
    read(X),end(X),
    nl.

end(X):-    
    X=q->write('SESSION END. THANK YOU. ');
    name(X,SL),prolist(SL,List),translate(List,W),cat(W,Disp,_),
    nl,
    write('Translated as:'),
    write(Disp),
    nl,
    run.

输出将是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    相关资源
    最近更新 更多