因此,我对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.
谢谢!
答案 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,B
,A,B,A
和B,A,A
,以及.. A
和B
为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,0
或1,1,1
的列表,无法满足这些模式,所以它们说false.
是因为无法证明它们是正确的。