Prolog:按子列表中的元素搜索大型子列表,然后删除子列表(如果找到)

时间:2014-04-13 19:04:35

标签: prolog

我的列表如下:

 [ [005,Chester,100], [001,Bob,99], [002,Andy,77] ... ]

每个子列表的前2个元素(ID和名称)是字符串(用单引号输入)

我正在尝试创建一个允许用户输入字符串的函数,然后在每个子列表的ID和Name字段中搜索输入的字符串。

因此,如果我输入'Chester',程序将在每个子列表的ID和Name字段中检查'Chester'。如果找到,程序将通知用户并删除子列表。如果没有找到,“写('未找到。')”示例:

Student: Chester removed
[ [001,Bob,99],[002,Andy,77] ... ]

我知道删除谓词,可以让它与平面列表一起使用,但是子列表列表给了我各种各样的问题。感谢

编辑:

到目前为止我已经得到了(感谢CapelliC)

process(8, X) :-
 nl,
 write('\tEnter student to delete: '),nl,nl,
 read_delete_info(A),
 select( [A,_,_] , X, Z),
 write(Z),
 nl, nl, menu(Z).

read_delete_info(A) :-
 write('\tStudent ID: '),
 read(A).

这将正确删除子列表,显示新列表并将新列表传递回菜单。

是否可以编辑select / 3以便如果没有匹配则会写入“No match”?或者如果匹配,它会显示匹配是什么以及返回新列表?感谢

1 个答案:

答案 0 :(得分:1)

您可以使用' if / then / else',或多或少以这种方式

...
(  select([A,_,_], X, Z)
-> write(Z),
   etc..
;  writeln('No Match')
),
...

另外,因为在第一篇文章中你愿意匹配ID或Name,你可以用这种方式组合测试

...
(  ( select([A,_,_], X, Z) ; select([_,A,_], X, Z) )
-> write(Z),
   etc..
;  writeln('No Match')
),
...