【问题标题】:Prolog, predicate that swaps 1 to 0 and 0 to 1 and puts them in a listProlog,谓词交换 1 到 0 和 0 到 1 并将它们放在一个列表中
【发布时间】:2017-06-27 15:33:45
【问题描述】:

Prolog 的新手。 我想要一个将 1 换成 0 和 0 换成 1 并回答这个问题的程序:

?- swap([1,1,0,1,0,0,0,1], L2).
L2 = [0,0,1,0,1,1,1,0]

【问题讨论】:

  • 你有没有做过任何可以展示和询问具体问题的尝试?
  • 我会提供一些线索。从规则的角度考虑它。基本情况是关于交换一个空列表,swap([], []).(交换的空列表也是一个空列表。)。然后是递归案例。例如,swap([1|X], ...) :- ...... 第一个参数是 [1|X] 会是什么样子(头部为 1 且列表尾部为 X 的列表)?

标签: binary prolog swap digits


【解决方案1】:
complement(0, 1).
complement(1, 0).

swap(X, Y) :- maplist(complement, X, Y).

【讨论】:

  • 感谢您的回答,但我正在尝试以递归方式执行此操作且不使用 maplist/3。还有其他方法吗?
  • @Mitsos 是的,还有其他几种递归方式。您可以查看99 Prolog Problems 并专注于列表处理的示例,以了解如何开始。在这一点上,很难说你知道多少 Prolog,而且这不是一个开始 Prolog 的教程网站。更多的是询问特定的编码问题。
【解决方案2】:

一个全方位都能正常工作的CLPFD方案,供参考:

:- use_module(library(clpfd)).

swap(X, Y) :-
    maplist(#\=, X, Y),
    X ins 0..1,
    Y ins 0..1.

具体来说:

?- swap(X,Y).
X = Y, Y = [] ;
X = [_2640],
Y = [_2658],
_2640 in 0..1,
_2640#\=_2658,
_2658 in 0..1 ;
X = [_3200, _3206],
Y = [_3224, _3230],
_3200 in 0..1,
_3200#\=_3224,
_3224 in 0..1,
_3206 in 0..1,
_3206#\=_3230,
_3230 in 0..1 ;
…

当来自另一个答案的swap/2 不能正常工作时:

?- swap2(X,Y).
X = Y, Y = [] ;
X = [0],
Y = [1] ;
X = [0, 0],        % Doesn't enumerate ([1],[0]), etc.
Y = [1, 1] ;
X = [0, 0, 0],
Y = [1, 1, 1] ;
…

【讨论】:

  • 尝试length(X,_), swap(X,Y). 与我的答案中的swap 进行公平枚举。
  • @danlei 这将在返回时产生无限循环,例如length(X,_), swap2(X,[1,0]).
  • 嗯,我的意思是使用最一般的查询生成,但是是的——很公平。
猜你喜欢
  • 2020-02-12
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 2017-11-28
相关资源
最近更新 更多