0

我正在尝试创建一个序言程序,它接受输入“我爱你”作为字符串,然后输出

"i love you"
"i love yo"
"i love y"
"i love "
"i love"
"i lov"
"i lo"
"i l"
"i "
"i"

我目前正在使用 SWI-Prolog,我拥有的代码如下。

sublist(S, L) :-
  append(_, L2, L),
  append(S, _, L2).

contains(A, B) :-
  atom(A),
  name(A, AA),
  contains(AA, B).

contains(A, B) :-
  sublist(B, A),
  B \= [].

我使用以下代码来执行代码:

?- forall(contains('我爱你',X),writef("%s\n",[X])).

以下是完全如图所示生成的输出。

i
i 
i l
i lo
i lov
i love
i love 
i love y
i love yo
i love you

 l
 lo
 lov
 love
 love 
 love y
 love yo
 love you
l
lo
lov
love
love 
love y
love yo
love you
o
ov
ove
ove 
ove y
ove yo
ove you
v
ve
ve 
ve y
ve yo
ve you
e
e 
e y
e yo
e you

 y
 yo
 you
y
yo
you
o
ou
u

我感谢任何和所有的帮助。提前非常感谢。

4

2 回答 2

1

我不完全理解您的要求(您的意思是that accept input "i love you" as a string什么?)但您并不真的需要一个程序来产生该输出:

?- forall(append(_, [F|S], "I love you"), format('"~s"~n', [[F|S]])).
"I love you"
" love you"
"love you"
"ove you"
"ve you"
"e you"
" you"
"you"
"ou"
"u"
true.

append/3 的第二个参数已被“模式化”为长度至少为 1,以避免最后一个空字符串,否则会导致。

编辑答案到目前为止它是错误的:我没有注意到它显示了尾巴!这是一个经过调试的过程,但充当生成器:

pheader([X]) :-
    format('~s~n', [[X]]), !.
pheader(L) :-
    format('~s~n', [L]),
    L = [_|Xs],
    pheader(Xs).

产量

?- pheader("i love you").
"i love you"
" love you"
"love you"
"ove you"
"ve you"
"e you"
" you"
"you"
"ou"
"u"
true.

那么你需要一个“程序”来完成它,最后!

编辑以恢复初始行为(标头生成器),这里有 2 个参数过程

pheader([X|Xs], [X|Xs]).
pheader([_|Xs], R) :-
    pheader(Xs, R).

最后产生所需的输出:

?- forall(pheader("i love you",X),format('"~s"~n', [X])).
"i love you"
" love you"
"love you"
"ove you"
"ve you"
"e you"
" you"
"you"
"ou"
"u"
true.
于 2013-03-13T10:28:12.967 回答
0

要删除列表的最后一个元素,您可以使用append(WithoutLast, [Last], List)

foo([]) :- !.
foo(S) :- format('"~s"~n', [S]), append(S1, [_Last], S), !, foo(S1).

?- foo("i love you").
"i love you"
"i love yo"
"i love y"
"i love "
"i love"
"i lov"
"i lo"
"i l"
"i "
"i"
true.

如果你不希望它是确定性的,你可以删除削减。

于 2013-03-13T12:50:44.183 回答