Prolog中的三元列表练习

时间:2019-04-20 09:01:49

标签: list prolog

因此,我对Prolog还是很陌生,从传统的编程语言转向它很难,所以最简单的练习会使我感到困惑。 我想知道如何创建像Triple(N,N1)这样的谓词,其中N是一个只有1和/或0和/或空变量(_)的3元素列表,它的工作方式如下:

如果N具有两个零,则该变量将替换为1。如果它有两个1,则变量将替换为0。如果N具有3个零或3个,则应返回false。

例如,

?- triple([1,_,1],R).
R = [1,0,1].

?- triple([1,1,0],R).
R = [1,1,0].

?- triple([_,0,0],R).
R = [1, 0, 0].

?- triple([1,_,0],R).
R = [1, _G396, 0].

?- triple([0,0,0],R).
false.

谢谢!

1 个答案:

答案 0 :(得分:0)

它需要聪明吗?您可以写出有效的模式,没有太多:

triple([0,0,0], _) :- false.
triple([0,0,1], [0,0,1]).
triple([0,1,0], [0,1,0]).
triple([0,1,1], [0,1,1]).
triple([1,0,0], [1,0,0]).
triple([1,0,1], [1,0,1]).
triple([1,1,0], [1,1,0]).
triple([1,1,1], _) :- false.

对模式进行编码对我来说似乎更困难。

  • 如果可以使用有效的布尔模式匹配三个项目的列表,我称它们为L1, L2, L3,则该列表是可接受的三元组。..
  • 有效模式为A,A,BA,B,AB,A,A,以及..
  • 仅当AB为0或1并且彼此不同时,这些模式才成立。

我回顾了这些内容,但是可能会有更好/更简单的版本

valid_a_b(A,B) :-
    (A=0; A=1),
    (B=0; B=1),
    A \= B.

pattern(A,A,B) :- valid_a_b(A,B).
pattern(A,B,A) :- valid_a_b(A,B).
pattern(B,A,A) :- valid_a_b(A,B).

triple([L1,L2,L3],[L1,L2,L3]) :- 
    pattern(L1,L2,L3).

序言将采用triple([0,1,_],R).并尝试找到一条路径来证明它是正确的。

它将找到pattern(A,A,B)并意识到A不能取0和1,因此不合适。

然后它将继续搜索并找到pattern(A,B,A)并放入A=0, B=1并尝试pattern(0,1,0)。检查A,B是否均为0,1且彼此不同-是的。 然后它将返回并说R = [0, 1, 0]

(并且碰到了一个选择点-这是一个有效的答案,但还没有耗尽搜索空间,您希望它继续搜索吗?)

对于0,0,01,1,1的列表,无法满足这些模式,所以它们说false.是因为无法证明它们是正确的。