【问题标题】:Palindrome (homework)回文(作业)
【发布时间】:2015-06-30 08:20:41
【问题描述】:

我尝试使用列表编写 Prolog 程序。但是,我必须使用 差异列表,输出应该是:

列表的第 ith 元素与列表的 (n-i+1)th 元素相同,n 是列表的长度。例如,[a,X,c,b,Y] 应该给出X = bY = a。我在其他问题中找不到类似的回文示例。

到目前为止我已经实现了:

% length of the list 
len([], 0).
len([H|T], B) :-
   len(T, NT),
   B is NT + 1.

% return the ith element of the list 
match([H|_], 0, H) :-
   !.
match([_|T], N, H) :-
   N > 0,
   N1 is N-1,
   match(T, N1, H).

但是,我无法完成。请帮帮我!

【问题讨论】:

  • Prolog 已经有length/2,所以你不需要编写自己的列表长度谓词(len/2)。还有一个 Prolog 谓词用于返回列表的第 n 个元素(参见 SWI Prolog 的 nth0/3nth1/3)。另外,您所描述的是一个回文。通过搜索“prolog palindrome”,您可能会找到几个可以使用的示例。
  • @mescalinum 我不这么认为。我还搜索了有关回文的其他问题。你能帮帮我吗

标签: list prolog palindrome dcg difference-lists


【解决方案1】:

使用定句语法!

DCG,Prolog 的主要功能,让使用差异列表变得容易——使您能够轻松编写简洁高效的代码!

想了解更多信息? 跟着点走:

废话不多说,上代码:

回文-> []。 回文-> [_]。 回文 --> [X],回文,[X]。 % 或者,我们还可以使用以下更紧凑的定义: 回文 --> [] | [_] | [X],回文,[X]。

完成。让我们运行几个查询!首先,OP给出的查询:

?- phrase(palindrome, [a,X,c,b,Y]).
   X = b, Y = a
;  false.

在德语中,“玉米”被称为"mais"。如果我们把"siam"(“泰王国”的旧称)放在前面,我们会得到一个delicious回文:

?- set_prolog_flag(double_quotes, chars)。 真的。 ?- 短语(回文,“siammais”)。 真的 ;错误的。 ?- 短语(回文,“siamais”)。 % 或踢一个中间的 'm' 字符 true % ... 对于奇数长度的回文 ;错误的。

最后,我们不要忘记最通用的查询

?- phrase(palindrome, Xs).
   Xs = []
;  Xs = [_A]
;  Xs = [_A,_A]
;  Xs = [_A,_B,_A]
;  Xs = [_A,_B,_B,_A]
;  Xs = [_A,_B,_C,_B,_A]
...

上,我们可以使用内置的Prolog 谓词listing/1 来查看DCG 被“翻译”到的代码——在这个级别, 的内部使用变得明显:

?- listing(palindrome//0).
palindrome(A, A).
palindrome([_|A], A).
palindrome([C|A], D) :-
    palindrome(A, B),
    B = [C|D].

true.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 2012-03-19
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多